zoukankan      html  css  js  c++  java
  • SQL中隐式转换导致无法使用索引

    看到网上的一个问题:为什么下面这条语句没有使用索引
    select * from user where phone = 13811223344;
    为此我们来做个小测试。创建一个user表,表中有4列,注意 phone列的类型为varchar,且该列上创建了索引。
    mysql> show create table user;
    +-----------+-----------------------------------------------------+
    | Table | Create Table |
    +-----------+-----------------------------------------------------+
    | big_table | CREATE TABLE `big_table` (
    `id` int(11) NOT NULL DEFAULT '0',
    `name` varchar(10) DEFAULT NULL,
    `phone` varchar(20) DEFAULT NULL,
    `addr` varchar(20) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `name` (`name`),
    KEY `idx_phone` (`phone`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +-----------+-----------------------------------------------------+

    然后我们插入一些数据,其中phone为123466121有一条数据。
    mysql> select * from big_table where phone = 123466121;
    +------+----------+---------------------+----------------------+
    | id     | name          | phone        | addr                   |
    +------+----------+---------------------+----------------------+
    | 9332 | dong9332 | 123466121 | addr123466121 |
    +------+----------+---------------------+----------------------+
    1 row in set (0.00 sec)

    这个时候,我们验证一下,发现果然没有使用索引。

    这是为什么呢?
    前面有强调,phone的类型是varchar,字符型!而后面的值并不是字符。这就需要隐式转换,导致phone列无法使用索引。
    当用'123466121'再验证,妥妥的使用了索引。

    总结:要尽量避免出现这种隐式转换。

    转载请注明出处:http://www.cnblogs.com/ayard/
  • 相关阅读:
    帮同事整理的 C# 调用 C++ 回调函数
    解决VS2010下使用NUnit 无法进行调试的问题
    Linux /var/log/messages 偶尔会发生time reset +6.288863s
    linux设置静态路由
    os auto installtion
    read 在bash ksh下的不同表现
    C#编码规范1
    C#中new一个对象时,发生了什么事?
    C# 实例化类的执行顺序
    C#类注释规范
  • 原文地址:https://www.cnblogs.com/ayard/p/9224722.html
Copyright © 2011-2022 走看看