本教程中所使用的数据库的建表语句都在“MySQL高阶教程索引”这篇文章中,点击链接直达:索引&建表语句
摘要:本文主要介绍Explain的常见字段——possible_keys
Explain字段解释——possible_keys
问:什么是覆盖索引?
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。
问:什么叫一个索引包含了所要查询的所有列?
就是存在一个索引,它包含了select后面的字段,和where后面的字段。
比如一个查询语句中,select、where、group by、order by等后边跟着的字段共有A、B、C、D四种字段,那么一定要存在一个索引,它至少包含了A、B、C、D四个字段,mysql才能对其使用覆盖索引。
只扫描索引而无需回表的优点:
1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。
2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用
4.innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询)
覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引。
扩展: