高性能的索引策略2

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) 

猜你喜欢

转载自www.cnblogs.com/wooluwalker/p/12237300.html
今日推荐