以 MySQL 为例我们来聊聊,索引创建原则和执行计划分析。

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

哪些情况需要创建索引?

  1. 主键自动建立唯一索引;
  2. 频繁作为查询条件的字段应该创建索引;
  3. 查询中与其他关联的字段,外键关系建立索引;
  4. 频繁更新的字段不是创建索引;
  5. where 条件中用不到的字段不创建索引;
  6. 单键/组合索引的选择, 通常在高并发下倾向于创建组合索引;
  7. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度;
  8. 查询中统计或分组字段;

哪些情况下不需要创建索引?

  1. 表记录太少

  2. 经常增删改的字段

虽然创建索引提高了查询速度,同时会降低更新表的速度,如对表进行 insert , update , delete 因为表更新时,
MySQL 不仅仅要保存数据,还要保存索引文件。

  1. 数据重复,且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。如果某个数据列包含多个重复的内容,为它建立索引就没有太大的实际效果。

a . 假如一个表由10万记录,由一个字段A只有 T 和 F 两种值,且每个值的分布概率大约为 50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
b. 索引的选择性是指缩影列中不同值的数目与表中记录数相比。如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是 1980/2000=0.99, 一个索引的选择性越接近于1,这个索引的效率就越高.

MySQL 性能分析

MySQL 常见性能瓶颈

  • CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据的时候
  • IO:磁盘 I/O 瓶颈发生在装入数据远大于内存容量的时候
  • 服务器硬件的性能瓶颈:top, free, iostat 和 vmstat 来查看系统的性能状态

MySQL 执行计划

  • 什么是执行计划?

    使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。

  • 执行计划能帮我们完成什么事情?

    a. 表的读取顺序 b. 数据读取操作的操作类型 c. 哪些索引可以使用 d. 哪些索引被实际使用 e. 表之间的引用 f. 每张表有多少行被优化器查询

执行计划 CASE

案例演示

image.png

案例分析

第一行 (执行顺序4):id 列为1 , 表示 union 的第一个 select , select_type 的 primary 表表示该查询为外层查询, table 列被标记为 , 表示查询结果来自一个衍生表,其中 derived3 中的 3 代表查询衍生自第三个 select 查询, 即 id 为 3 的 select [select d1.name ... ]

第二行(执行顺序为2):id 为 3 ,是整个查询中第三个 select 的一部分, 因查询包含在from 中, 所以为derived 。 【select id, name from where other_column = ''】

第三行(执行顺序为3):select 列表中的子查询 select_type 为 subquery , 为整个查询中的第二个 select . [select id from t3]

第四行(执行顺序为1):select_type 为 union , 说明第四个 select 是 unin 里的第二个 select , 最先执行 【select name ,id from t2】

第五行(执行顺序为5):代表 union 的临时表中读取行的阶段, table 列的 <union , 1, 4> 表示用第一个 和第四个 select 结果进行union 操作 。 【两个结果 union 操作】

猜你喜欢

转载自juejin.im/post/7017102765021200421