你了解MySql覆盖索引吗?

简单点来讲,总是开篇简单讲,其实有的面试简单说一下就够啦,其实面试官就问你一下了解不了解。

覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键上去取数据。

下面详细的讲一下:

覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引。

当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息:

 

覆盖索引的坑:mysql查询优化器会在执行查询前判断是否有一个索引能进行覆盖,假设索引覆盖了where条件中的字段,但不是整个查询涉及的字段,mysql5.5和之前的版本也会回表获取数据行,尽管并不需要这一行且最终会被过滤掉。

 

 

 

如上图则无法使用覆盖查询,原因:

1.没有任何索引能够覆盖这个索引。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。

2.mysql不能在索引中执行LIke操作。mysql能在索引中做最左前缀匹配的like比较,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配。这种情况下mysql只能提取数据行的值而不是索引值来做比较

最后总结一下:


  当一条查询语句符合覆盖索引条件时,sql只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。
使用覆盖索引Innodb比MyISAM效果更好----InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了

  注:遇到以下情况,执行计划不会选择覆盖查询
  1.select选择的字段中含有不在索引中的字段 ,即索引没有覆盖全部的列。
  2.where条件中不能含有对索引进行like的操作。'

 

哎 也没办法,现在市场上各种人才都太多了,只能通过各种原理性问题来筛选大多数的小朋友了,太难了。

 

奔跑吧,蜗牛~

posted @ 2020-03-26 10:32  秋天的风,夏天的雨  阅读(480)  评论(0编辑  收藏  举报