MySQL使用索引的典型场景

以下案例表用的是MySQL官网的案例库sakila。

匹配全值

对索引中所有列都指定具体值,即是对索引中的所有列都有等值匹配的条件。

例如,租赁表 rental 中通过指定出租日期 rental_date + 库存编inventory id+ 客户编号customer id 的组合条件进行查询,从执行计划的 key和extra 两字值看到优化器选择了复合索引idx rental date:

EXPLAIN SELECT * from rental where rental_date='2005-05-25 17:22:10' and inventory_id=373 and customer_id=343;

匹配值的范围查询

对索引的值进行范围查找。

例如,检索租赁表rental中客户编号customer_id在指定范围的记录:

EXPLAIN SELECT * from rental where  customer_id >=373 and customer_id < 400

类型 ype 为 range 说明优化器选择范围查询,索引 key 为 idx_fk_customer_id 说明优化器选择索引 idx_fk_customer_id 来加速访问,注意到这个例子中 Extra列为 Using index condition,表示MySQL使用了ICP来进一步优化查询,在检索的时候,把条件customer_id的过滤操作下推到存储引擎层来完成,这样能够降低不必要的IO访问。

匹配最左前缀

仅仅使用索引中的最左边列进行香找,比如在c0l1 +col2 +col3 字段上的联合索引能够被包含 col1、(col1 + col2)、(col1 +col2 + col3)的值查询利用到,可是不能够被 col2、(col2 + col3)的等值查询利用到;

以支付表 payment为例,如果查询条件中仅包含索引的第一列支付日期 payment date 和索引的第三列更新时间update 的时候,从执行计划的 key 和 extra 看到优化器仍然能够使用复合索idx_payment_date进行条件过滤:

alter table payment add INDEX idx_payment_date(payment_date,amount,last_update);
EXPLAIN SELECT * from payment where payment_date='2006-02-14 15:16:03' and last_update='2006-02-15 22:12:32'

但是,如果仅仅选择符合索引idx_payment_date的第二列支付金额amount和第三列更新时间last_update进行查询时,那么执行计划显示并不会利用到索引idx_payment_date:

EXPLAIN SELECT * from payment where amount=3.98 and last_update='2006-02-15 22:12:32'

覆盖索引

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

EXPLAIN SELECT last_update from payment where payment_date='2006-02-15 22:12:32' and  amount=3.98 

Extra部分变成Using index,意味着,现在直接访问索引就足够获取到所需要的数据,不需要通过索引回表查询。

匹配列前缀

仅仅使用索引列中的第一列,并且只包含索引第一列的开头一部分进行查找。

例如,现在需要查询出标题title是以AFRICAN开头的电影信息,从执行计划能够清楚看到,idx_title_desc_part索引被利用上了:

create index idx_title_desc_part on film_text(title(10),description(20));

EXPLAIN SELECT title from film_text where title like 'AFRICAN%'

Extra值为Using where表示优化器需要通过索引回表查询数据。

索引匹配部分精确而其他部分进行范围匹配

例如,需要查询出租日期 renlal date 为指定日期且客户编号 customer id为指定范围的库存:

EXPLAIN  select inventory_id from rental where rental_date='2006-02-14 15:16:03' and customer_id >= 300 and customer_id <= 400

类型 type为 range 说明优化器选择范围查询,索引key 为 idx_rental_date 说明优化器选择索引idx_rental_date 帮助加速查询,同时由于只查询索引字段 inventory_id 的值,所以在 Extrs郭分能看到 Using ndex,表示查询使用了覆盖索引扫描。

column name is null

如果列名是索引,那么使用column_name is null 就会使用索引。

EXPLAIN SELECT * from payment where rental_id is null 

展开阅读全文

页面更新:2024-04-24

标签:索引   组合   字段   库存   场景   典型   编号   条件   案例   日期   类型   客户

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top