索引的分类:
聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
最左前缀是什么意思?
比如给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