MySQL-索引篇

数据结构

Hash

  • 对索引的key进行一次hash计算就可以定位出数据存储的位置
  • 很多时候Hash索引要比B+Tree更高效
  • 仅能满足=、in,不支持范围查询
  • hash冲突问题(数组+链表)

B Tree

指的是 Balance Tree,也就是平衡树,平衡树是一颗查找树,并且所有叶子节点位于同一层。

B-Tree

  • 叶子节点具有相同的深度,叶节点的指针为空。
  • 所有索引的元素不重复
  • 节点中的数据索引从左到右递增排列

B+Tree(默认)

  • B+ Tree 是 B 树的一种变形,它是基于 B Tree 和叶子节点顺序访问指针进行实现,通常用于数据库和操作系统的文件系统中。
  • B+ 树有两种类型的节点:内部节点(也称索引节点)和叶子节点,内部节点就是非叶子节点,内部节点不存储数据,只存储索引(索引空白部分指向其他页的地址,可以放更多的索引),数据都存在叶子节点。
  • 内部节点中的 key 都按照从小到大的顺序排列,对于内部节点中的一个 key,左子树中的所有 key 都小于它,右子树中的 key 都大于等于它,叶子节点的记录也是按照从小到大排列的。
  • 查看页大小:show global status like 'innodb_page_size';

索引最佳实践

  • 全值匹配
  • 最左前缀法则
  • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
  • 存储引擎不能使用索引中范围条件右边的列
  • 尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少 select * 语句
  • mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描< 小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引
  • is null,is not null 一般情况下也无法使用索引
  • like以通配符开头('$abc...')mysql索引失效会变成全表扫描操作
  • 字符串不加单引号索引失效
  • 少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引
  • 范围查询优化
posted @ 2023-12-20 23:42  轻寒  阅读(7)  评论(0编辑  收藏  举报