MySQL性能优化实践( 四 )

该命令执行之前,需要执行其他 SQL 语句才有记录 。
5.2.4 查询指定 ID 的执行详细信息【MySQL性能优化实践】show profile for query Query_ID;返回结果:
mysql> show profile for query 9;+----------------------+----------+| Status               | Duration |+----------------------+----------+| starting             | 0.000207 || checking permissions | 0.000010 || Opening tables       | 0.000042 || init                 | 0.000050 || System lock          | 0.000012 || optimizing           | 0.000003 || statistics           | 0.000011 || preparing            | 0.000011 || executing            | 0.000002 || Sending data         | 0.000362 || end                  | 0.000006 || query end            | 0.000006 || closing tables       | 0.000006 || freeing items        | 0.000011 || cleaning up          | 0.000013 |+----------------------+----------+15 rows in set, 1 warning (0.00 sec)每行都是状态变化的过程以及它们持续的时间 。Status 这一列和 show processlist 的 State 是一致的 。因此,需要优化的注意点与上文描述的一样 。
5.2.5 获取 CPU、 Block IO 等信息show profile block io,cpu for query Query_ID;show profile cpu,block io,memory,swaps,context switches,source for query Query_ID;show profile all for query Query_ID;六、优化手段
主要以查询优化、索引使用和表结构设计方面进行讲解 。
6.1 查询优化1) 避免 SELECT *,需要什么数据,就查询对应的字段 。
2) 小表驱动大表,即小的数据集驱动大的数据集 。如:以 A,B 两表为例,两表通过 id 字段进行关联 。
当 B 表的数据集小于 A 表时,用 in 优化 exist;使用 in ,两表执行顺序是先查 B 表,再查 A 表
select * from A where id in (select id from B)当 A 表的数据集小于 B 表时,用 exist 优化 in;使用 exists,两表执行顺序是先查 A 表,再查 B 表
select * from A where exists (select 1 from B where B.id = A.id)3) 一些情况下,可以使用连接代替子查询,因为使用 join,MySQL 不会在内存中创建临时表 。
4) 适当添加冗余字段,减少表关联 。
5) 合理使用索引(下文介绍) 。如:为排序、分组字段建立索引,避免 filesort 的出现 。更多:来一份MySQL索引数据结构及优化清单
6.2 索引使用6.2.1 适合使用索引的场景1) 主键自动创建唯一索引
2) 频繁作为查询条件的字段
3) 查询中与其他表关联的字段
4) 查询中排序的字段
5) 查询中统计或分组字段
6.2.2 不适合使用索引的场景1) 频繁更新的字段
2) where 条件中用不到的字段
3) 表记录太少
4) 经常增删改的表
5) 字段的值的差异性不大或重复性高
6.2.3 索引创建和使用原则1) 单表查询:哪个列作查询条件,就在该列创建索引
2) 多表查询:left join 时,索引添加到右表关联字段;right join 时,索引添加到左表关联字段
3) 不要对索引列进行任何操作(计算、函数、类型转换)
4) 索引列中不要使用 !=,<> 非等于
5) 索引列不要为空,且不要使用 is null 或 is not null 判断
6) 索引字段是字符串类型,查询条件的值要加''单引号,避免底层类型自动转换
违背上述原则可能会导致索引失效,具体情况需要使用 explain 命令进行查看


推荐阅读