MySQL索引优化常考题

内容并不详细,但均为高频考察点,每个不熟悉的地方都应该自行寻找拓展资料。

考点:

  • 索引的原理、类型、结构
  • 创建索引的注意事项,使用原则
  • 如何排查和消除慢查询

1 索引的原理、类型、结构

什么是索引:

  • 索引是数据表中一个或多个列进行排序的数据结构
  • 索引可以大幅提升检索速度
  • 创建、更新索引本身也会消耗空间和时间

查找发展史:

  • 顺序查找
  • 折半查找(插入慢)
  • Hash(占空间,不适用于大数据,底层是冗余数组)
  • BST(不适用于大数据,复杂度易退化)
  • AVL树(是二叉树,结点多时,仍非常高)
  • 多路查找树
  • 多路平衡查找树——B树与B+树

B树:

  • m阶多路平衡查找树
  • 叶节点有相同深度
  • 节点数据的关键字递增
  • 无法有效实现范围查找

B+树(B树的变形):

  • MySQL实际使用的作为索引的数据结构
  • 只在叶子结点带有指向记录的指针,目的是将存储空间让给叶子结点,增加树的度
  • 叶子结点通过指针(双向)相连,实现范围查找

多路平衡查找树的阶并不是越大越好:

  • 阶越大,树的高度越低,这是好事
  • 但硬盘分块、内存分页,阶应该是根据硬盘块的大小确定的,这与OS管理硬件的方式有关
  • 为了让OS更好的加载、缓存数据,一般将4KB作为结点大小

MySQL索引类型:

  • 普通索引(CREATE INDEX)
  • 唯一索引(CREATE UNIQUE INDEX)
  • 多列索引
  • 主键索引(PRIMARY KEY),一个表只能有一个
  • 全文索引(FULLTEXT INDEX),InnoDB不支持,是搜索引擎的搜索原理,通过倒排索引实现

创建索引的注意事项,使用原则

何时创建索引:

  • 经常作查询条件的字段(WHERE)
  • 经常用作表连接的字段
  • 经常出现在order by,group by之后的字段

注意事项:

  • 索引字段应非空,即NOT NULL,MySQL难以对空值作查询优化,因为空值在B+树中无法比较,所以很多都有默认值
  • 索引字段应区分度高、离散度大,不应该有大量相同值,例如一个枚举值,就没必要
  • 索引字段长度不应太长,否则比较较为耗时,例如主键索引为INT,快,而字符串比较就很慢

如何排查和消除慢查询

索引失效(慢查询)的情况:

扫描二维码关注公众号,回复: 8765366 查看本文章
  • 模糊匹配,以%开头的LIKE语句,这是因为B+树无法对此进行直接比较
  • 类型隐转,这是因为B+树无法对两个类型不同的量进行直接比较
  • 不满足最左前缀原则

总的来说,都是B+树的key无法进行有效的比较

如何排查慢索引:

  • 通常是由于缺少索引、索引不合理或业务代码导致
  • 可通过slow_query_log_file开启并查询慢查询日志
  • 可以通过explain排查索引问题
  • 防止数据类型不匹配导致的全表扫描
  • 防止一次获取太多访问
发布了100 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/liujh_990807/article/details/104067356