高性能的MySQL(5)索引策略-覆盖索引与索引排序
一、覆盖索引
索引是一种查找数据的高效方式,但是MySQL也可以使用索引来直接获取列的数据,这样就不再需要读取数据行。如果索引的叶子节点中已经包含要查询的数据,那么还有什么必要回表查询呢? 如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为“覆盖索引”。 覆盖索引的好处: 1、索引条目通常远小于数据行大小,所以如果只需要读取索引,就极大的减少数据访问量。这对MyISAM尤其正确,因为MyISAM能压缩索引以变得更小。 2、因为索引是按照顺序存储的,所以对于I/O密集型的范围查询会比随机从磁盘读取每一行数据的I/O要少很多。 3、由于InnoDB的聚簇索引,覆盖索引对InnoDB特别有用。InnoDB的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询。 覆盖索引必须要存储索引列的值,而哈希索引、空间索引、和全文索引都不能存储列的值,所以MySQL只能使用B-Tree索引做覆盖索引。 当发起一个索引覆盖的查询时,在EXPLAIN的Extra列可以看到Usingindex的信息。例如: 如果索引覆盖了WHERE条件中的字段,但不是整个查询涉及的字段,看看是什么情况 没有任何索引能覆盖这个查询,因为查询从表中选择了所有的列,而没有任何索引覆盖所有的列。但是索引还是用到了。 接下来可以对比一下,可以使用聚簇索引的InnoDB和MyISAM对覆盖索引的区别。 首先看MyISAM表,表结构如下 (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |