高性能MySQL 索引章节温习笔记

时间:2021-01-22 19:43:02

  1. 索引就是存储引擎用于快速找到记录的一种数据结构。
  2. B-Tree索引是利用B-Tree树的优势,以页面为B-tree树的节点来组织数据,缩短数据的查找时间。此索引的查找步骤是先根据索引列的键值在二级索引树的叶子节点上查找出符合条件的主键的键值,然后依据主键的键值在聚簇索引树上查找出所要查找的所有记录。
  3. Hash索引是存储引擎对索引的所有列进行hash计算出一个hash码,然后将hash码存在hash表中(所以hash索引只能用于等值查询,且无覆盖索引类型)。此索引的查找步骤是首先根据等值查询的条件计算出hash值,然后使用该值在hash表中查找出指向对应的记录的行指针,通过行指针来获取行记录,最后使用行记录中的值与查询条件比较,检验是否符合查询条件。
  4. B-Tree索引可以用于等值之外的其他类型的查询,而且可以使用覆盖索引来避免排序。Hash索引只能用于等值查询,由于其索引不存储具体的数据所以无覆盖类型,必须要回表,Hash索引的等值查询速度很快,而且hash索引占用的空间小,节省内存。
  5. 索引的本质在于牺牲空间来节约时间成本。前缀索引,索引的高选择性与节约存储空间的矛盾就是具体的体现。
  6. 对于索引顺序列设计时,首先要考虑利用索引来排序和分组将减少随机I/O,其次通过高选择性创建索引来优化where的条件查询。
  7. 设计索引时一方面根据查询语句中的where来创建索引,另一方面使索引包含查询所涉及的所有列来避免回表的I/O开销。
  8. 对于利用覆盖索引来优化查询,有时需要重构查询,延迟关联是一个好方法:重构查询,利用覆盖索引查询出一列关键字段,然后利用该单列结果集在外层查询查找所有数据。
  9. 利用索引做排序的条件:1.索引列顺序与order by 列顺序一致。2.order by 所有列的排序方向一致(都是desc 或都是asc)。3.关联多张表时排序列须是第一张表的列。4.满足左前缀(where 常量 +order by )
  10. 重复索引:在相同列上按照相同的顺序创建相同类型的索引。
  11. 查询使用索引在锁方面的好处:行锁效率高、内存使用少、提高并发性
  12. innodb在二级索引上使用共享锁,访问聚簇索引时需要排他锁(提高并发性)。
  13. 索引的使用会使得查询在存储引擎层过滤掉多数数据,来减少锁定的数据行,由此提高并发性。且索引中的数据只是聚簇索引数据的一部分,索引一个页中的数据量更大,使用索引会减少随机I/O,也节约了内存空间的使用。
  14. 索引设计的步骤:
    1. 根据where子句中的列的频率和列的选择性设计索引
    2. 需要时优化查询,在查询优化与索引中找到平衡
    3. 考虑常见的where条件来设计索引
    4. 将范围放在查新的最后一个条件,因为范围列之后的列无法使用索引