基础知识点:
索引失效
- 复合索引不符合最佳左前缀原则。即没有使用第一列索引字段,或者跳过复合索引的中间列。
- 复合索引左边的列上使用了范围查询,右边的索引列也用不了。
- 在索引列上做函数计算等。
- 索引列上使用不等于、is null、is not null。
- 模糊匹配%放在左边。如果必须放在左边,需使用覆盖索引。
- 字符串不加单引号会降低索引效率。
聚簇索引
概述:是一种数据的存储方式。InnerDB的聚簇索引实际上在同一结构中保存了B-Tree索引和数据行。
InnerDB默认使用主键作为聚簇索引,如果没有主键,使用一个唯一的非空索引代替,若无,再会隐士定义一个主键来作为聚簇索引。
优点:
- 将相关数据放在一起。
- 数据访问更快。因为聚簇索引将索引和数据保存在同一个B-Tree中。
覆盖索引
概述:一个索引包含所有需要查询的字段的值。这样的索引就是覆盖索引。可以极大提高性能,因为只需要扫描索引,无须回表。
冗余索引:
概述:如果创建了索引(A,B),再创建索引(A)就是冗余索引。
多数情况下都不需要冗余索引,应该尽量拓展已有的索引而不是创建新索引。若拓展已有的索引会导致其变得更大,也可考虑冗余索引。
问答:
- 如何判断一个系统创建的索引是否合理?
一般是按照响应时间对查询进行分析,找出耗时久或耗费资源多的查询,然后检查这些查询的schema,SQL和索引结构。判断是否扫描太多行,是否有额外排序或使用临时表,是否是使用随机I/O访问数据,是否有太多的回表查询操作。
其他知识点:
- 针对范围查询,应该尽可能将范围查询的列放到索引的后面,或使用in代替范围查询。
- 针对分页当翻到后面比较慢时,可以使用反范式化、预先计算和缓存解决。