参考:深入浅出MySql和高性能MySql
聚簇索引:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。
聚簇索引是将数据行的内容放在B--tree的叶子节点中,节点列存放数据列,由于不能把数据行放在两个不同的地方,所以每个表只能有一个聚簇索引。MySql的聚簇索引只能将主键作为索引。如果没有主键,则选择唯一的非空索引,如果都没有,则隐式定义主键,但是这样很不好,相邻键值相距会很远。
因为聚簇索引将相邻键值的数据行存在一起,所以能很快的查找到相关数据。
聚簇索引缺陷:
:如果数据全部存在内存内,则访问的顺序不重要,此时聚簇索引失去了其优势。
:依赖插入顺序,如果不是按主键顺序插入,则最好优化一下表。
:更新聚簇索引代价很高,InnoDB将被更新的行强制移动到别的位置。
:插入操作或者更新主键时可能会导致页分裂。
:导致全表扫描变慢。
:二级索引更大。因为二级索引的包含了行的主键值。
聚簇索引和非聚簇索引的区别在于聚簇索引的叶子节点里包括了数据行的内容,而非聚簇索引叶子节点里不是,可以是数据存放的地址,也可以是二级索引指向表的主键值。
覆盖索引:一个索引包含所有要查询的字段的值。
优点:
①:索引条目通常远小于数据行,因此如果只读取索引,可以极大的减小数据访问量,同样索引也更容易放入内存,所以对于I/O密集型的应用有很大帮助。
②:索引是按照列顺序存储的。
③:有的存储引擎如MyIsam只在内存中缓存索引,数据依赖于操作系统缓存,因此覆盖索引避免了频繁的系统调用。
覆盖索引必须要存储索引列的值,而哈希索引,空间索引和全文索引都不存储索引列的值,所以覆盖索引必须使用B-Tree索引。