Mysql性能优化-索引


本文基于mysql5.7版本

MYSQL体系结构

  1. client connectors 连接客户端 jdbc odbc
  2. services & uitlities 服务和工具类 备份还原 安全
  3. connection pool 连接池
  4. sql interface 接收用户sql DML DDL Trigger Views etc等
  5. Parser 解析器 解析sql 由lex和yacc实现
  6. optimizer 优化器 优化查询语句 提高查询效率
  7. chches 缓存 查询缓存
  8. Pluggable Storage Engines 存储引擎 MyISAM InnoDb

image-20200810102122949

索引

正确的创建合适的索引,是提升数据库查询性能的基础

索引是什么?

索引是为了加速对表中的数据行的检索而创建的一种分散存储的数据结构

为什么要使用索引?

  1. 索引能极大的减少存储引擎需要扫描的数据量
  2. 索引可以把随机IO变成顺序IO
  3. 索引可以帮助我们在进行分组,排序等操作时,避免使用临时表

为什么选择B+树作为索引?

平衡二叉查找树

image-20200810095830566

  1. 数据处的高度决定他的IO操作次数,IO操作耗时大。平衡二叉树太深了。
  2. 每一个磁盘块保存的数据量太小了,没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘的IO的预读能力,从而带来频繁的IO操作

多路平衡查找树 - B树

image-20200810100402929

加强版多路平衡查找树 - B+树

image-20200810100508488

B树和B+树区别

  1. B+节点关键字搜索采取左闭合区间
  2. B+非叶子节点不保存数据相关信息,只保存关键字和子节点引用
  3. B+关键字对应的数据保存在叶子节点中
  4. B+叶子节点是顺序排列的,相邻节点具有顺序引用的关系

为什么选用B+树

B+树是B树的变种,拥有B树的优势

B+树的扫库,表能力更强

B+树的磁盘读取能力更强

B+树排序能力更强

B+树查询速度更稳定

B+树在Innodb 和 Myisam存储引擎中的表现形式

image-20200810101717813

相关索引知识

  1. 列的离散性
    差异越大离散性越好,选择性越高
  2. 最左匹配原则
    对索引中关键字进行计算,一定是从左往右依次进行,且不可跳过
  3. 联合索引
    单列索引【name】, 联合索引【name,age】,单列索引是特殊的联合索引
    联合索引原则
    • 经常用的列优先【最左匹配原则】
    • 选择性高的优先【离散度高原则】
    • 宽度小的列优先【最少空间原则】
  4. 覆盖索引
    如果查询列可以通过索引节点中的关键字直接返回,该索引称之为覆盖索引。覆盖索引可以减少数据库IO,将随机IO变成顺序IO,提高查询性能。

总结

  1. 索引列长度能少则少
  2. 索引不是越多越好,而是需要简历合适的索引
  3. 匹配列前缀可以用到索引 like mao%
  4. where条件中not in 和<>无法使用索引
  5. 匹配范围值 order by也可以用到索引
  6. 多用指定列查询,提高索引命中概率
  7. 联合索引最左匹配,不是按照索引最左列开始找,无法使用索引
  8. 联合索引精准匹配最左范围匹配另外一列可以用到索引
  9. 联合索引中查询中有某个列范围查询,则其右边的所有列无法使用索引