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/
  • 相关阅读:
    快速排序及其优化
    JVM基础:深入学习JVM堆与JVM栈(转)
    java 反射简介(转载)
    java 泛型简介(转载)
    Java 注解简介
    JVM入门必看——JVM结构
    Java多线程详解(转载)
    SpringMVC 实现文件的上传与下载
    死锁简介
    SQL的模糊查询(转载)
  • 原文地址:https://www.cnblogs.com/ayard/p/9224722.html
Copyright © 2011-2022 走看看