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/
  • 相关阅读:
    List 集合的常用方法总结
    springboot 整合 web 项目找不到 jsp 文件
    Web 安全
    微服务开放平台接口设计
    SpringCloud Hystrix 参数
    SpringCloud Eureka 配置
    ELK 日志收集系统
    网盘搜索引擎原理
    jsPlumb.jsAPI阅读笔记(官方文档翻译)
    ionic获取ios唯一设备id的解决方案
  • 原文地址:https://www.cnblogs.com/ayard/p/9224722.html
Copyright © 2011-2022 走看看