6 覆盖索引
【可参考博文 https://www.cnblogs.com/kerrycode/p/9909093.html】
如果一个索引包含所有需要查询的字段,则称之为“覆盖索引”。
使用覆盖索引,只需要扫描索引,而无需回表:
- 一般索引比数据行数少,若只需要读取索引,则mysql访问数据量会减少
- 索引是按照索引列值排序的,所以对于IO密集型范围查询会比随机从磁盘读取每一行数据的磁盘IO要少得多
当发起一个被索引覆盖的查询是,在EXPLAIN中的extra列可以看到 “Using index”的信息。
延迟关联
Explain select * from products where actor = ‘SEAN Carrey‘ and title like ‘%APOLLO%‘;
上述查询不能走上索引:
- 没有任何索引能够覆盖这个查询。因为查询从表总选择了所有列,没有任务索引覆盖了所有列。
- Mysql在索引上执行like操作是有局限在性的,这是底层存储引擎的限制:
- 在索引中做最左前缀匹配的like操作可以走索引,like ‘APoLLO%‘,底层可以转换成比较操作
- 通配符开头的like, like ‘%APOLLO%‘,是不能走索引的
针对上述情况,可以通过重新设计索引来规避:
修改索引为 actor,title,prod_id
- 先通过覆盖索引查询出来prod_id
- 再通过prod_id在外层查询匹配获取需要的所有列值,即:
select *
from products
join (
select prod_id from products where actor = ‘SAEN CARREY‘ and title like ‘%APOLLO%‘
) as t1
on (t1.prod_id = products.prod_id)
原文地址:https://www.cnblogs.com/wooluwalker/p/12237300.html
时间: 2024-10-10 12:37:25