`
jsntghf
  • 浏览: 2542870 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

当MySql的Where值类型和数据字段类型不一致时会发生什么?

阅读更多

在多数时候我们都会对数据库建立索引,然后在SQL中尽可能的用上索引中使用的字段,但是我们这样做后,确实用到了这个索引了吗?事实是未必的,比如当SQL中Where条件值类型和字段定义的类型不一致时,这个索引就不会被用上。

 

定义如下表结构:
CREATE TABLE users (
phone varchar(21),
stat varchar(4),
KEY phonestat (stat, phone)
);

 

插入n多的数据后来做测试,首先查看插入的数据记录数。
SELECT count(*) FROM users;

+----------+
| count(*) |
+----------+
|     5925 |
+----------+
1 row in set (1.85 sec)

 

我们写两个SQL,一个

SELECT SQL_NO_CACHE count(*) FROM users WHERE stat = 0;

+----------+
| count(*)  |
+----------+
|     3640   |
+----------+
1 row in set (0.05 sec)
再看另一个SELECT SQL_NO_CACHE count(*) FROM users WHERE stat = '0';

+----------+
| count(*)  |
+----------+
|     3566   |
+----------+
1 row in set (0.00 sec)

 

为什么前面一种写法执行所需要时间较长并且所选择出的记录数多一些呢?

 

我们使用EXPLAIN看一下对索引的使用情况。

 

EXPLAIN SELECT SQL_NO_CACHE count(*) FROM users WHERE stat = 0;

+----+-------------+-----------+-------+---------------+-----------+---------+------+------+--------------------------+
| id | select_type | table     | type  | possible_keys | key       | key_len | ref  | rows | Extra                    |
+----+-------------+-----------+-------+---------------+-----------+---------+------+------+--------------------------+
|  1 | SIMPLE      | users | index | phonestat     | phonestat |      75 | NULL | 5925 | Using where; Using index |
+----+-------------+-----------+-------+---------------+-----------+---------+------+------+--------------------------+
1 row in set (0.00 sec)


看rows 5925,实际进行了一次全表检索,索引没有用上。

 

再看第二种


EXPLAIN SELECT SQL_NO_CACHE count(*) FROM users WHERE stat = '0';

+----+-------------+-----------+------+---------------+-----------+---------+-------+------+--------------------------+
| id | select_type | table     | type | possible_keys | key       | key_len | ref   | rows | Extra                    |
+----+-------------+-----------+------+---------------+-----------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | users | ref  | phonestat     | phonestat |      12 | const | 2968 | Using where; Using index |
+----+-------------+-----------+------+---------------+-----------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)

 

为什么会这样呢,原因就在于所使用的条件的字段值类型和数据库定义的字段类型不一致时,MySQL就会在内部做数据转化,它的处理行为就会和我们期望的有些不一样,在这里当我们使用整数来作为定义中的字符串字段做比较时,MySQL会自动将数据库中的记录转化为整数做比较,而且将空值转化为整数0做比较,所以选出来的记录数多一些。

由此得到当MySQL的Where值类型和数据库定义的字段类型不一致时会发生:

 

1. 建立的索引实际没有被用上,导致查询效率低下。
2. 由于数据库对一些值的默认转化,导致查询的结果偏离实际的期望。

分享到:
评论

相关推荐

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、查询出所有数据进行分组之后,和重复数据...

    mysql字段加密

    MySQL 字段加密 ...MySQL 字段加密是通过设置 varbinary 类型的字段、设置加密盐为全局变量和使用 AES_ENCRYPT 和 AES_DECRYPT 函数来实现的。这种方法可以对敏感数据进行保护,提高数据库的安全性。

    Mybatis 处理 CLOB、BLOB 类型数据

    Mybatis 处理 CLOB、BLOB 类型数据 MyBatis 处理 CLOB、BLOB 类型数据是指在使用 MyBatis ...通过使用 MyBatis 处理 CLOB 和 BLOB 类型数据,可以方便地存储和读取大字段类型的数据,提高应用程序的性能和可扩展性。

    mysql自增字段重排 mysql删除表后自增字段从1开始.pdf

    - 当创建一个带有AUTO_INCREMENT属性的表时,可以使用`AUTO_INCREMENT=n`选项指定自增字段的初始值。 - 对于已存在的表,可以使用`ALTER TABLE table_name AUTO_INCREMENT=n`命令来更改自增字段的起始值。 2. **...

    mysql 查询表中多少个字段

    了解如何查询MySQL表中的字段数量对于进行数据管理和编程至关重要。本文介绍了多种方法来实现这一目标,包括使用`INFORMATION_SCHEMA.COLUMNS`表、`DESCRIBE`命令以及`SHOW COLUMNS FROM`命令。每种方法都有其适用...

    向数据库插入blob数据实例源码--在mysql中通过

    在MySQL中,Blob类型字段常用于存储大块的非结构化数据。本实例将详细介绍如何在MySQL数据库中插入Blob数据,并提供源码示例。 1. **Blob类型介绍** MySQL中的Blob类型有四种变体:TinyBlob、Blob、MediumBlob和...

    Mysql root用户对应的host字段缺少localhost导致本地无法访问数据库问题修复

    但是,在使用 Mysql 时,很容易遇到一些问题,例如 Mysql root 用户对应的 host 字段缺少 localhost 导致本地无法访问数据库问题。这种问题的产生是由于 root 用户对应的 host 值没有设置为 localhost,导致本地无法...

    mysql导出指定数据或部份数据的方法

    在MySQL数据库管理中,有时我们需要导出特定的数据或者部分数据,而不是整个数据库。传统的`mysqldump`工具虽然强大,但并不适用于这种情况。本文将介绍三种方法来解决这一问题。 **方法一:使用INSERT INTO......

    oracle中的BLOB(照片)转换到mysql中

    在IT行业中,数据库管理系统(DBMS)如Oracle和MySQL在数据存储方面扮演着至关重要的角色。Oracle数据库系统支持多种复杂的数据类型,其中包括BLOB(Binary Large Object),用于存储非结构化的大数据,如图片、音频...

    MySql 按时间段查询数据方法(实例说明)

    通过上述示例可以看出,根据时间字段的存储格式和查询需求的不同,MySQL提供了相应的函数来执行按时间段的数据查询。需要注意的是,上述示例中对时间字段的操作假设了字段类型已经是适合进行日期比较的类型(如DATE...

    mysql数据库精华.doc

    除此之外,MySQL还提供了丰富的函数和过程,如控制流程函数、字符串函数、数学函数、日期和时间函数等,这些都是在处理数据时不可或缺的工具。学习和理解这些高级功能将使你在数据库管理和开发中更加游刃有余。

    mysql 同时更新多行数据不同的值

    mysql 同时更新多行数据不同的值 一个复杂的多条件更新sql: update users set status = (case user_id when 1 then 0 when 3 then 1 when 4 then 0 else status end) where user_id in (1,3,4) 在多数情况下,执行...

    MySQL BLOB类型中二进制字段和批量操作输入.docx

    在处理BLOB类型的字段时,由于其二进制特性,不能直接使用字符串拼接的方式插入数据,而是需要使用PreparedStatement接口。PreparedStatement允许预编译SQL语句,并能有效地处理二进制数据。例如,在Java中,可以...

    mysql 测试数据集,单表200万条数据

    MySQL是一种广泛使用的开源关系型数据库管理系统,以其高效、稳定和易于使用的特点,深受开发者和企业的青睐。本测试数据集提供了一张包含200万条数据的单表,这对于数据库性能测试、查询优化、大数据处理以及系统...

    Mysql中类型转换

    例如,在进行数据分析或数据合并时,如果不同表中的数据类型不一致,则可能会导致查询失败或结果不准确。通过类型转换,我们可以确保所有数据都符合预期的数据格式,从而提高数据处理的效率和准确性。 #### 二、...

    使用Kettle同步mysql数据,增量同步教程执行步骤

    在IT行业中,数据同步是一项关键任务,特别是在大数据处理和企业级应用中。本文将深入探讨如何使用Kettle工具实现MySQL数据库之间的增量同步。Kettle,也称为Pentaho Data Integration (PDI),是一款强大的ETL(提取...

    MySQL实现两张表数据的同步

    mysql通过触发器实现两个表的同步,需要了解的朋友可以看一下。 有两张表A和B,要求往A里面插入一条记录的同时要向B里面也插入一条记录,向B里面插入一条记录的同时也向A插入一条记录。两张表的结构不同,需要将...

    常用的sql语句。新建表、删除表、插入数据、删除数据、更新数据、新增字段、删除字段、修改字段、新建约束、删除约束,等等常用语句

    ### 常用SQL语句详解 #### 一、创建表 (Create Table) 在SQL语言中,`CREATE TABLE`命令用于定义一个新...此外,不同的数据库管理系统(如Oracle、MySQL等)可能会有一些细微的区别,但基本原理和语法结构是一致的。

    mysql测试数据新闻数据城市数据

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,用于存储和管理各种类型的数据,如新闻、城市等。在这个场景中,"mysql测试数据新闻数据城市数据"可能指的是一个用来测试MySQL数据库性能或者功能的样本数据集,...

Global site tag (gtag.js) - Google Analytics