5.1 方式一:explain
筛选出有问题的 SQL,我们可以使用 MySQL 提供的 explain 查看 SQL 执行计划情况(关联表,表查询顺序、索引使用情况等)。
用法:
explain select * from category;
返回结果:
mysql> explain select * from category; +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | category | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+ 1 row in set, 1 warning (0.00 sec)
字段解释:
1) id:select 查询序列号。id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行
2) select_type:查询数据的操作类型,其值如下:
simple:简单查询,不包含子查询或 union primary:包含复杂的子查询,最外层查询标记为该值 subquery:在 select 或 where 包含子查询,被标记为该值 derived:在 from 列表中包含的子查询被标记为该值,MySQL 会递归执行这些子查询,把结果放在临时表 union:若第二个 select 出现在 union 之后,则被标记为该值。若 union 包含在 from 的子查询中,外层 select 被标记为 derived union result:从 union 表获取结果的 select
3) table:显示该行数据是关于哪张表
4) partitions:匹配的分区
5) type:表的连接类型,其值,性能由高到底排列如下:
system:表只有一行记录,相当于系统表 const:通过索引一次就找到,只匹配一行数据 eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常用于主键或唯一索引扫描 ref:非唯一性索引扫描,返回匹配某个单独值的所有行。用于=、< 或 > 操作符带索引的列 range:只检索给定范围的行,使用一个索引来选择行。一般使用between、>、<情况 index:只遍历索引树 ALL:全表扫描,性能最差
注:前5种情况都是理想情况的索引使用情况。通常优化至少到range级别,最好能优化到 ref
6) possible_keys:指出 MySQL 使用哪个索引在该表找到行记录。如果该值为 NULL,说明没有使用索引,可以建立索引提高性能
7) key:显示 MySQL 实际使用的索引。如果为 NULL,则没有使用索引查询
8) key_len:表示索引中使用的字节数,通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好
显示的是索引字段的最大长度,并非实际使用长度
9) ref:显示该表的索引字段关联了哪张表的哪个字段
10) rows:根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好
11) filtered:返回结果的行数占读取行数的百分比,值越大越好
12) extra: 包含不合适在其他列中显示但十分重要的额外信息,常见的值如下:
using filesort:说明 MySQL 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。出现该值,应该优化 SQL using temporary:使用了临时表保存中间结果,MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。出现该值,应该优化 SQL using index:表示相应的 select 操作使用了覆盖索引,避免了访问表的数据行,效率不错 using where:where 子句用于限制哪一行 using join buffer:使用连接缓存 distinct:发现第一个匹配后,停止为当前的行组合搜索更多的行
注意:出现前 2 个值,SQL 语句必须要优化。
https://www.cnblogs.com/moonlightL/p/7634294.html
这个是sql优化的步骤 ,具体请再看
来源:https://www.cnblogs.com/wishlix/p/8573913.html