0%

MySQL学习笔记-MySQL数据库索引优化

MySQL支持的索引类型

Btree索引

  • 通过B+Tree结构存储数据

  • 加快数据的查询速度

  • 更适合进行范围查找

  • 顺序存储

  • 什么情况下可以使用到

    • 全值匹配的查询
    • 匹配最左前缀的查询
    • 匹配列前缀查询
    • 匹配范围值的查询
    • 精确匹配左前列并范围匹配另外一列
    • 只访问索引的查询
  • 使用限制

    • 如果不是按照索引最左列开始查找,则无法使用索引
    • 使用索引时不能跳过索引中的列
    • not in和<>不能使用索引
    • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引

Hash索引

  • 特点

    • 基于hash表实现,只有查询条件精确匹配hash索引中的所有列的时候才能够使用hash索引
    • 对于hash索引中的所有列,存储引擎都会为每一行计算一个hash码,hash索引中存储的就是hash码
  • 限制

    • hash索引必须进行二次查找
    • hash索引无法用于排序
    • hash索引无法进行范围查找,不支持部分索引查找
    • hash索引中的hash码的计算可能存在has冲突

为什么要使用索引

  • 索引大大减少了存储引擎需要扫描的数据量

  • 索引可以帮助我们进行排序,以避免使用临时表

  • 索引可以把随机I/O改变为顺序I/O

索引不是越多越好

  • 索引会增加写操作的成本

  • 太多的索引会增加查询优化器的选择时间

索引优化策略

索引列上不能使用表达式或者函数

前缀索引和索引列的选择性

  • 索引的选择性是不重复的索引值和表的记录数的比值

联合索引

  • 如何选择索引列的顺序

    • 经常被使用到的列优先
    • 选择性高的列优先
    • 宽度小的列优先

覆盖索引

  • 优点

    • 可以优化缓存,减少磁盘IO操作
    • 可以减少随机I/O,变随机I/O操作为顺序I/O操作
    • 可以避免对Innodb主键索引的二次查询
    • 可以避免MyISAM表进行系统调用
  • 无法使用覆盖索引的情况

    • 存储引擎不支持覆盖索引
    • 查询中使用了太多的列
    • 使用了双%号的like查询

使用索引来优化查询

  • 使用索引扫描来优化排序

    • 通过排序操作
    • 按照索引顺序扫描数据
    • 索引的列顺序和Order By子句的顺序完全一致
    • 索引中所有列的方向(升序,降序)和Order By子句完全一致
    • Order by中的字段全部在关联表中的第一张表中
  • 模拟Hash索引优化查询

    • 只能处理键值的全值匹配
    • 所使用的Hash函数决定着索引键的大小
  • 利用索引优化锁

    • 索引可以减少锁定的行数
    • 索引可以加快处理速度,同时也加快了锁的释放

索引的维护和优化

  • 删除重复和冗余的索引

  • 查找未被使用过的索引

  • 更新索引统计信息以及减少索引碎片

    • analyze table table_name
    • optimize table table_name

附件:Xmind图

MySQL数据库索引优化