索引可以提高查询的速度,但并不是使用带有索引的字段查询时,索引都会起作用。使用索引有几种特殊情况,在这些情况下,

有可能使用带有索引的字段查询时,索引并没有起作用,下面重点介绍这几种特殊情况。

1. 查询语句中使用LIKE关键字

在查询语句中使用 LIKE 关键字进行查询时,如果匹配字符串的第一个字符为“%”,索引不会被使用。如果“%”不是在第一个位置,索引就会被使用。

例 1
为了便于理解,我们先查询 tb_student 表中的数据,SQL 语句和运行结果如下:

mysql> SELECT * FROM tb_student;
+----+------+------+------+
| id | name | age  | sex  |
+----+------+------+------+
|  1 | 张三 |   12 | 男   |
|  2 | 李四 |   12 | 男   |
|  3 | 王五 |   13 | 女   |
|  4 | 张四 |   13 | 女   |
|  5 | 王四 |   15 | 男   |
|  6 | 赵六 |   12 | 女   |
+----+------+------+------+

下面在查询语句中使用 LIKE 关键字,且匹配的字符串中含有“%”符号,使用 EXPLAIN 分析查询情况,SQL 语句和运行结果如下:

mysql>  EXPLAIN SELECT * FROM tb_student WHERE name LIKE '%四'\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 6filtered: 16.67Extra: Using where
mysql> CREATE INDEX index_name ON tb_student(name);
mysql>  EXPLAIN SELECT * FROM tb_student WHERE name LIKE '李%'\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: range
possible_keys: index_namekey: index_namekey_len: 77ref: NULLrows: 1filtered: 100.00Extra: Using index condition

第一个查询语句执行后,rows 参数的值为 6,表示这次查询过程中查询了 6 条记录;第二个查询语句执行后,rows 参数的值为 1,表示这次查询过程只查询 1 条记录。同样是使用 name 字段进行查询,因为第一个查询语句的 LIKE 关键字后的字符串是以“%”开头的,所以第一个查询语句没有使用索引,而第二个查询语句使用了索引 index_name。

2. 查询语句中使用多列索引

多列索引是在表的多个字段上创建一个索引,只有查询条件中使用了这些字段中的第一个字段,索引才会被使用。

例 2
在 name 和 age 两个字段上创建多列索引,并验证多列索引的使用情况,SQL 语句和运行结果如下:

mysql> CREATE INDEX index_name_age ON tb_student(name,age);
mysql> EXPLAIN SELECT * FROM tb_student WHERE name LIKE '李%'\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: range
possible_keys: index_name_agekey: index_name_agekey_len: 77ref: NULLrows: 1filtered: 100.00Extra: Using index condition
mysql> EXPLAIN SELECT * FROM tb_student WHERE age LIKE '12'\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: ALL
possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 6filtered: 16.67Extra: Using where

第一条查询语句的查询条件使用了 name 字段,分析结果显示 rows 参数的值为 1,且查询过程中使用了 index_name_age 索引。第二条查询语句的查询条件使用了 age 字段,结果显示 rows 参数的值为 6,且 key 参数的值为 NULL,这说明第二个查询语句没有使用索引。

因为 name 字段是多列索引的第一个字段,所以只有查询条件中使用了 name 字段才会使 index_name_age 索引起作用。

3. 查询语句中使用OR关键字

查询语句只有 OR 关键字时,如果 OR 前后的两个条件的列都是索引,那么查询中将使用索引。如果 OR 前后有一个条件的列不是索引,那么查询中将不使用索引。

例 3
下面演示 OR 关键字的使用。

mysql> EXPLAIN SELECT * FROM tb_student WHERE name='张三' or sex='男'\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: ALL
possible_keys: index_name,index_name_agekey: NULLkey_len: NULLref: NULLrows: 6filtered: 30.56Extra: Using where
mysql> EXPLAIN SELECT * FROM tb_student WHERE name='张三' or id='12'\G
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: index_merge
possible_keys: PRIMARY,index_name,index_name_agekey: index_name,PRIMARYkey_len: 77,4ref: NULLrows: 2filtered: 100.00Extra: Using union(index_name,PRIMARY); Using where

由于 sex 字段没有索引,所以第一条查询语句没有使用索引;name 字段和 id 字段都有索引,所以第二条查询语句使用了 index_name 和 PRIMARY 索引 。

总结

使用索引查询记录时,一定要注意索引的使用情况。例如,LIKE 关键字配置的字符串不能以“%”开头;使用多列索引时,查询条件必须要使用这个索引的第一个字段;使用 OR 关键字时,OR 关键字连接的所有条件都必须使用索引。

12、索引在什么情况下不会被使用?相关推荐

  1. jpa 每次启动都要创建外键索引_什么情况下外键建立索引?是必须的吗

    朋友问了一个问题: 首先,外键什么情况下采用呢? 外键是否采用看业务应用场景,以及开发成本的 1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能 ...

  2. 复合索引在什么情况下使用

    http://topic.csdn.net/t/20060813/16/4946416.html 1.复合索引使用的目的是什么? :能形成索引覆盖,提高where语句的查询效率 2.一个复合索引是否可 ...

  3. 作为唯一索引_Mysql什么情况下不走索引?

    本文基于Mysql5.7版本和InnoDB存储引擎. 1.InnoDB索引组织表 在InnoDB引擎中,表都是按照主键顺序组织存放的,这种存放方式的表称为索引组织表.InnoDB存储引擎中的表,都有主 ...

  4. oracle 复合索引原则,复合索引在什么情况下使用

    http://topic.csdn.net/t/20060813/16/4946416.html 1.复合索引使用的目的是什么? :能形成索引覆盖,提高where语句的查询效率 2.一个复合索引是否可 ...

  5. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?...

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  6. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  7. mysql 有索引 不被使用方法_MySQL教程100-索引在什么情况下不会被使用?

    索引可以提高查询的速度,但并不是使用带有索引的字段查询时,索引都会起作用.使用索引有几种特殊情况,在这些情况下,有可能使用带有索引的字段查询时,索引并没有起作用,下面重点介绍这几种特殊情况. 1. 查 ...

  8. 在Python中给定包含该项目的列表的情况下查找项目的索引

    对于列表["foo", "bar", "baz"]和列表"bar" ,如何在Python中获取其索引(1)? #1楼 a ...

  9. MySQL索引优化:哪些情况下需要建立索引(适合构建索引的几种情况)

    适合构建索引的几种情况: 引言 我们知道正确的建立索引可以加快数据库的查询,但是如果索引建立不当,或者随意的建立过多索引不仅不会提升数据库的效率,反而在进行数据更新操作的时候需要耗费系统资源对索引进行 ...

最新文章

  1. react 子组件获取变量属性值
  2. R语言扩展包dplyr——数据清洗和整理
  3. 微擎css使用php变量,$_Wamp;全局变量
  4. 小程序渲染html的两种方法
  5. Netty学习笔记(六)Pipeline的传播机制
  6. python指针引用的区别_C++基础:指针和引用的区别
  7. java 6 update 3_Java(TM) 6 Update(java运行环境) V 6.0.450.6 官方版
  8. 解决swiper-slide在ion-slide-box不滑动的问题(暂且这么描述)
  9. Spring JDBC最佳实践(2)
  10. 线性结构 —— ST 表与 RMQ
  11. 软件技术实习_当您还在学校时,如何获得一流的技术实习机会和技术工作
  12. php页面采集正则,PHP simple_html_dom.php+正则 采集文章代码
  13. php如何请求api,PHP如何发送GET/POST请求调用API
  14. gdiPlus 显示图片缩放不正确的可能解决方案
  15. yjk计算书_用户手册
  16. hmdb51数据集,视频+标签
  17. 网卡设置不当造成断线
  18. 打开WORD文档出错提示
  19. 【linux内核分析与应用-陈莉君】内核同步概述
  20. 换硬币将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

热门文章

  1. cf 1062d 思维 欧拉筛变形
  2. eclipse 配置jsp
  3. requirements.txt
  4. git已有项目修改提交
  5. echarts用法配置
  6. linux中vim常用命令总结
  7. vnc--centos 7 安装和配置
  8. Java高新技术第一篇:类加载器详解
  9. 明早1点去青岛,可能要两天不能写博客了
  10. Day02-深度学习原理与使用方法