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

1.匹配全值,对索引中的所有列都有等值匹配的条件。
MySQL中能够使用索引的典型场景_第1张图片
优化器用了idx_rental_date索引进行扫描,type字段的值为ref,表示是在非唯一索引扫描下,返回匹配某个单独值的记录行。

2.匹配值的范围查找。
MySQL中能够使用索引的典型场景_第2张图片
类型type为range说明优化器选择范围查找,这里Extra为Using index comdition,表示优化器不需要回表查询数据,在存储引擎层完成了筛选再去表内取的数据。

3.匹配最左前缀,仅仅使用索引中最左边的列进行查找,比如在col1+col2+col3字段上的联合索引能被包含col1、col1+col2、col1+col2+col3的等值查询利用到,可是不能被col2、col2+col3的等值查询利用到。
MySQL中能够使用索引的典型场景_第3张图片

4.仅仅对索引进行查询,当查询的列都在索引字段中时,查询效率更高。
MySQL中能够使用索引的典型场景_第4张图片
Extra部分是Using index,即覆盖索引扫描,直接访问索引就能获取到所需数据,不用通过索引回表,减少不必要的数据访问能提升效率。

5.匹配列前缀,仅仅使用索引中的第一列,并且只包含索引第一列的开头一部分进行查找。
MySQL中能够使用索引的典型场景_第5张图片
Extra部分是Using where表示需要通过索引回表查询数据。

(6)能够实现索引匹配部分精确而其它部分进行范围匹配。
MySQL中能够使用索引的典型场景_第6张图片

(7)如果列名是索引,那么使用column_name is null 就会使用索引。
MySQL中能够使用索引的典型场景_第7张图片
(8)MySQL5.6引入了Index Condition PushDown(ICP) 的特性,进一步优化了查询,某些情况下的条件过滤操作下放到存储引擎。
MySQL中能够使用索引的典型场景_第8张图片
Extra部分为Using index condition就表示使用了ICP来优化查询,在检索时,把条件customer_id的过滤操作下推到存储引擎层来完成,能降低不必要的IO访问。
MySQL5.6之前,存储引擎会通过遍历索引定位基表中的行,然后返回给Server层,再去为这些数据行进行WHERE后的条件的过滤。MySQL5.6之后支持ICP后,如果WHERE条件可以使用索引,MySQL 会把这部分过滤操作放到存储引擎层,存储引擎通过索引过滤,把满足的行从表中读取出。我理解的ICP特性是说现在不需要回表查询数据了,在存储引擎层完成筛选再回表取数据。
5.5版本的复合索引:
MySQL中能够使用索引的典型场景_第9张图片
5.6版本的ICP:
MySQL中能够使用索引的典型场景_第10张图片

你可能感兴趣的:(MySQL)