SQL优化的目标

减少磁盘 IO,这个又可以说是尽量避免全表扫描、尽量使用索引以及尽量使用覆盖索引。

减少内存 CPU 消耗,这一部分主要是尽可能减少排序、分组、去重之类的操作。

EXPLAIN命令

EXPALIN 命令的大概用法是 EXPLAIN your_sql,然后数据库就会返回一个执行计划

ab344a50a2a03332fc243b42d30901e9.webp

执行计划有很多字段,最关键的几个字段:

type:指的是查询到所需行的方式,从好到坏依次是 system > const > eq_ref > ref > range > index > ALL。

system 和 const 都可以理解为数据库只会返回一行数据,所以查询时间是固定的。

eq_ref 和 ref 字面意思是根据索引的值来查找。

range:索引范围扫描。

index:索引全表扫描,也就是扫描整棵索引。

ALL:全表扫描,发起磁盘 IO 的那种全表扫描。possible_keys:候选的索引。

key:实际使用的索引。

rows:扫描的行数。数据库可能扫描了很多行之后才找到你需要的数据。

filtered:查找到你所需的数据占 rows 的比例。

索引列的创建