讨论/技术交流/分享|2021MySQL 慢查询SQL优化总结(下) | 技术人求职记/
分享|2021MySQL 慢查询SQL优化总结(下) | 技术人求职记

前言

上一篇文章 2021MySQL 慢查询SQL优化总结(上),我们主要通过索引优化的方式提升了查询SQL的性能。

在实际面试中,还会常常问道,谈谈你对MySQL索引的理解?

向上述常见的开放型试题,提前准备,一般都能答的不错。如果你没有提前准备过,可以参考一下我的总结。

InnoDB

目前比较常用的存储引擎是 InnoDB。

在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式为索引组织表。

InnoDB 索引模型

  • 主键索引(聚簇索引)的叶子节点存的是整行数据。
  • 非主键索引(二级索引)的叶子节点存的是主键的值
  • 一般主键索引是在建表的时候就确定了,ID常常作为主键索引
  • 二级索引,往往是随着数据库数据量的增大,我们通过不断的优化,设计,迭代出来的。
  • 唯一索引不允许索引具有相同的行。
  • 复合索引:两个或者两个以上的列创建的索引。复合索引一般按照最左匹配原则创建。

主键索引和普通索引有什么区别?

  • 从数据结构来看,普通索引获取整行数据需要再次在主键索引中搜索一次,这个过程也叫回表。
  • 主键索引不允许null,普通索引的值可以为null。
  • 一个表只能有一个主键,可以有多个索引。

MySQL 默认使用的索引一定正确吗?

  • 一般情况下,在设计并创建好索引之后,MySQL 一般自己选择使用哪个索引。
    在大多数情况下,MySQL 选择执行的索引是正确的。

  • 实际开发中,有时候 MySQL 执行的索引不正确。这时候,我们可以使用 force index 强行指定要执行的索引。或者,重新修改优化我们的 SQL 来提升查询效率。

Explain 执行计划字段说明

  • id:序列号,id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行
  • select_type:查询数据的操作类型(SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION)
  • table:行所在的表名字
  • type:访问类型,常见的类型有:

all(全表扫描)

index(扫描全部索引树)

range(扫描部分索引)

index_merge(索引合并)

ref(非唯一性索引扫描)

eq_ref(唯一性索引扫描)

const、system(常量)

效率由高到底:system > const > eq_ref > ref > range > index > all

  • possible_keys:可供选择的索引
  • Key :解析器判断最优的使用索引
  • key_len:索引中使用的字节数,在不损失精确性的情况下,长度越短越好
  • Ref :显示该表的索引字段join了哪张表的哪个字段
  • Rows :根据表统计信息及选用情况,大致估算出找到记录所需扫描的行数,数值越小越好
  • filtered:返回结果的行数占读取行数的百分比
  • Extra :包含了一些比较重要的额外信息

Using filesort:需要额外排序,不能通过索引顺序达到排序效果。

Using temporary:查询使用临时表,一般出现排序,分组,多表join,查询效率不高。

Using index:使用了覆盖索引,效率比较好。

如何提升查询性能?

mysql.jpg

根据产生慢查询的总结,可以提出以下方案:

  • 硬件优化:更大的内存, SSD 磁盘
  • 架构优化:读写分离,增加缓存
  • 合理的表设置: 合适的字段

你有什么优化建议吗?欢迎和我一起讨论交流~

4
共 2 个回复

整挺好

总结得很好👍