索引的点

索引的分类:

  聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

  非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。

  

最左前缀是什么意思?

  比如给t_user表的a,b,c 三个字段创建了索引,就是索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。

  

select * from t_user where a=""and b=""and c=""

select * from t_user where a=""and b=""

select * from t_user where a=""

  以上sql语句索引有效。

 

回表是什么意思?

  select * from t_user  where a="";

  这条sql就会造成回表,因为mysql会根据索引a先查询出a所在的主键id来,然后在根据id来查询整条语句。

  差不多就是索引出去又回到主键。

  总结:如果使用索引数据库首先查找索引,而不是漫无目的的全表遍历。

索引覆盖是什么意思:

  select a from t_user where a"";

  索引覆盖了要查询的字段。

 

加一个问题,顺便浅谈一下聚簇索引和非聚簇索引

索引为什么用在很多值重复的字段上会失效?

首先我们要明白一点:一个表只能有一个聚簇索引,默认是主键(就算我们创建表的时候没有主键,引擎也会默认给加一个),但一个表可以有多个非聚簇索引(唯一索引,全文索引都是)

而且非聚簇索引会包含聚簇索引的引用,如果 select 字段不在非聚簇索引内,就需要跳到主键索引。
如果非聚簇索引值重复率高,那么查询时就会大量出现上图中从右边跳到左边的情况,导致整个流程很慢(想一想回表)

 参考自:https://www.cnblogs.com/buwuliao/p/11650363.html

posted @ 2021-03-12 11:55  老油条666  阅读(65)  评论(0编辑  收藏  举报