索引基础

  1. 索引的类型

    1. B-Tree索引
      1. 通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。
      2. B-Tree对索引列是顺序组织存储的,所以很适合范围查询。
      3. 可以使用B-Tree索引的查询类型。
        1. 全值匹配
        2. 匹配最左原则
        3. 匹配列前缀
        4. 匹配范围值
        5. 精确匹配某一列
        6. 只访问索引的查询
    2. 哈希索引
      1. 基于哈希表实现,只有精确匹配索引的所有列的查询才有效。
      2. 因为索引本身只包含哈希值和行指针,并不存储字段值。
      3. 哈希索引数据并不是按照索引值顺序排序,所以不支持范围查找。
      4. 哈希索引不支持部分索引列查找,因为是根据所有列来计算哈希值的,如列(A,B)哈希值为10,而列A哈希值为1
    3. 空间数据索引(R-Tree)
    4. 全文索引

      高性能的索引策略

  2. 独立的列

    1. 如果查询中的列不是独立的,则MySQL就不会使用索引,如下所示
    2. SELECT name FROM user WHERE id + 1 = 5
  3. 前缀索引和索引的选择性
    1. 选择性是指不重复的索引值和数据表中的记录总数的比值,当选择值越高则查询效率越高。
    2. aababc使用长度为2的aa做索引比使用长度为1的做索引选择度要高
    3. 前缀索引是一种尽可能小、更快的有效办法,另一方面,MySQL无法使用前缀索引ORDER BY 或者 GROUP BY,也无法使用前缀索引做索引覆盖。
  4. 多列索引
    1. 当出现服务器对多个索引做相交操作时,通常意味着需要一个包含所有相关列的多列索引,而不是多个独立的单列索引。
  5. 选择合适的索引列顺序
    1. 一般来说使用选择度较高的列放在最前面。
  6. 聚簇索引
    1. 当表有聚簇索引时,它的数据行实际上存放在索引的叶子叶上,术语"聚簇"标识数据行和相邻的键值紧凑的存储在一起。因为无法同时把数据行存放在两个不同的地方,所以一个表只能由一个聚簇索引,
  7. 在InnoDB表中按主键顺序插入行
    1. 尽可能的使用单调递增的聚簇键来插入新值。
    2. 减少页分裂。
  8. 索引覆盖
    1. 根据索引直接获取值,而不需要再次读取行数据。
  9. 冗余和重复索引
    1. 当对数据进行插入、更新操作时,需要额外维护索引会导致速度变慢。
    2. 解决很简单,删除掉就好。