一、MySQL中能够使用索引的典型场景

1、匹配全值。对索引中的列都有等值匹配的条件。即使是在and中,and前后的列都有索引并进行等值匹配。

2、匹配值的范围查询,对索引的值能够进行范围查找。

3、匹配最左列前缀,仅仅使用索引中的最左边列进行查找。这个要考虑组合索引了。

4、仅仅对索引进行查询,当查询的列都在索引的字段中时,查询的效率更高。

5、匹配列前缀,仅仅使用索引中的第一列,并且包含索引第一列的开头一部分进行查找。比如 like 'appl%';

6、能够实现索引匹配部分精确而其他部分进行范围匹配。

7、MySQL5.6引入了ICP特性,进一步优化了查询,在某些情况下的条件过滤操作下放到存储引擎。

(以上的如果不懂的话我们可以参考《深入浅出MySQL》书籍273页)

针对第 7 种,当我们在执行计划里面看到这个标志就表示MySQL使用了ICP特性进一步优化查询:

mysql> explain select * from co2 where campaign_id=4561 and id <= 10000 and id >=300 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: co2
partitions: NULL
type: ref
possible_keys: PRIMARY,campaign_id
key: campaign_id
key_len: 8
ref: const
rows: 1
filtered: 5.00
Extra: Using index condition
1 row in set, 1 warning (0.01 sec)

使用 “Extra: Using index condition” 表示将过滤操作下推到存储引擎层来完成,这样能够降低不必要的IO访问,提高效率。

一般上Extra参数还有其他取值:比如:

1)Extra:using index :这个表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表读取。这样子的好处就是只访问必须访问的数据,一般情况下,减少不必要的数据访问可提高效率。

2)Extra:using where:表示优化器除了利用索引加速查询,还需要根据索引回表查询数据。

除此之外,文件系统使用xfs是最好的,因为这种文件系统也是b-tree结构最接近于数据库的树状结构。

二、MySQL中能够存在索引但不能使用索引的典型场景

1、以 “%” 开头的LIKE查询不能利用B-Tree索引,例如:like '%PLE',如果非要这样子使用,建议此列使用全文索引来解决。

2、数据类型出现隐式转换的时候也不会使用索引。特别是当列类型是字符串,那么一定要在where条件中吧字符常量值用引号引起来,否则即使这个列上有索引,MySQL也不会使用。

3、复合索引下,查询条件不包含索引最左边部分,即不满足最左原则。

4、用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。例如:

mysql> explain select * from co2 where id <= 1000000 or cctime= 4565 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: co2
partitions: NULL
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 85292357
filtered: 40.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)

这里的id是主键,cctime是非索引列。因此不能使用索引。

注意:大家可能会把or与and搞混了,上面的or中是:or前的列有索引,or后面的列无索引,那么此时执行该语句将不会使用索引。但是and并不是这样子,and前的列有索引,而and后的列无论有没有索引,此时该语句无论如何都会使用索引。(小贴士:and后面的列如果是范围查询的话,此列还不如不加索引。type有可能ref变为range。)

mysql> explain select * from co2 where id <= 1000000 and cctime= 4565 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: co2
partitions: NULL
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 8
ref: NULL
rows: 405614
filtered: 10.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)

MySQL使用索引的场景分析、不能使用索引的场景分析的更多相关文章

  1. 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景

    大家好,我是melo,一名大三后台练习生 专栏回顾 索引的原理&&设计原则 欢迎关注本专栏:MySQL高级篇 本篇速览 在我们上一篇文章中,讲到了索引的原理&&设计原则 ...

  2. mysql性能优化-慢查询分析、优化索引和配置

    一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connec ...

  3. MySQL使用索引的场景及真正利用索引的SQL类型

    1. 为什么使用索引 在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关.对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否sel ...

  4. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  5. [转]mysql性能优化-慢查询分析、优化索引和配置

    一. 优化概述 MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候.磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在 ...

  6. mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)

    mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...

  7. mysql性能优化-慢查询分析、优化索引和配置【转】

    一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1)      max_connec ...

  8. mysql性能优化-慢查询分析、优化索引和配置 MySQL索引介绍

    MySQL索引介绍 聚集索引(Clustered Index)----叶子节点存放整行记录辅助索引(Secondary Index)----叶子节点存放row identifier-------Inn ...

  9. MySQL高级学习笔记(四):索引优化分析

    文章目录 性能下降 SQL慢 执行时间长 等待时间长 查询语句写的烂 查询数据过多 关联了太多的表,太多join 没有利用到索引 单值 复合 服务器调优及各个参数设置(缓冲.线程数等)(不重要DBA的 ...

  10. 9.mysql性能优化-慢查询分析、优化索引和配置

    目录 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 max_connections ...

随机推荐

  1. 配置 Nginx 的目录浏览功能

    Nginx 默认是不允许列出整个目录的,需要配置 Nginx 自带的 ngx_http_autoindex_module 模块实现目录浏览功能 . location / { alias /opt/fi ...

  2. SQL 必知必会·笔记<9>使用子查询

    子查询(subquery),即嵌套在其他查询中的查询. 1. 利用子查询进行过滤 SELECT 语句中,子查询总是从内向外处理.示例: SELECT cust_name, cust_contact F ...

  3. Java并发编程笔记之ArrayBlockingQueue源码分析

    JDK 中基于数组的阻塞队列 ArrayBlockingQueue 原理剖析,ArrayBlockingQueue 内部如何基于一把独占锁以及对应的两个条件变量实现出入队操作的线程安全? 首先我们先大 ...

  4. sql server备份和还原

    官方文档:http://msdn.microsoft.com/zh-cn/library/ms187048%28v=sql.90%29.aspx

  5. phpStorm使用技巧总结

    工欲善其事,必先利其器. 拥有一个好的工具不仅可以事半功倍,而且也令人神清气爽. 在编辑器上,我所走过的路是这样的:notepad(对,就是最原始的WIN下的note) -> editplus ...

  6. Angular2入门:TypeScript的类 - 定义、继承和作用域

    一.定义和继承 二.public.private和protected

  7. #11 Python字典

    前言 前两节介绍了Python列表和字符串的相关用法,这两种数据类型都是有序的数据类型,所以它们可以通过索引来访问内部元素.本文将记录一种无序的数据类型——字典! 一.字典与列表和字符串的区别 字典是 ...

  8. VS2017进程为idXXXX 无法启动解决方案

    1.对无法启动项目的 .csproj 后缀文件用记事本打开 找到<WebProjectProperties>xx</WebProjectProperties> 删掉 让后 重新 ...

  9. c#方法转异步例子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. CSS总结div中的内容垂直居中的五种方法

    一.行高(line-height)法 如果要垂直居中的只有一行或几个文字,那它的制作最为简单,只要让文字的行高和容器的高度相同即可,比如: p { height:30px; line-height:3 ...