一、通过命令查看性能分析报告
set @@profiling=1;
select * from talbe;
show profiles;
二、进行计划分析
explain select * from event;
得出的结果为以下字段:
id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra
- id 查询的序列号
- select_type 查询的类型,包括:普通查询、联合查询和子查询
- table
- type 联合查询使用的类型
- possible_keys 使用哪个索引在该表中找到该行,如果这个值是空值,则表示没有相关的索引,这时性能有待提升。
- key 实际使用的键,如果没有为null
- key_len 键长度
- ref 显示哪个字段或常数与key一起被使用
- rows 这个值表示mysql要遍历多少行才能找到数据
- Extra 如果显示onley index表示使用了索引;如果显示where used则使用了where
- using filesort表示使用了orderby 和group by
- select tables optimized way:使用聚合函数,并且mysql进行了快速定位。通常是使用了max,min,count等。
type显示的类型是重要的性能指标,由好到坏分别是:
system 系统表
const 读常量
eq_ref 最多一条匹配结果,通常是通过主键访问
ref 被驱动表索引引用
fulltext 全文索引检索
ref_or_null 带空值的索引查询
index_merge 合并索引结果集
unique_subquery 子查询中返回的字段是唯一组合或索引
index_subquery 子查询返回的是索引,但非主键
range 索引范围扫描
index 全索引扫描
All 全表扫描
总结:一般来说,保证查询至少达到range级,最好能达到ref级,all为全表扫描,是最坏的情况。
这种情况往往是没用上索引。
mysql索引建立的基本原则:
- 合理设计和使用索引
- 在关键字段的索引上,建与不建索引,查询的速度相关100倍。
- 差的索引和没有索引效果一样
- 索引并非越多越好,因为维护索引需要成本。
- 每个表的索引应在5个以下,应合理利用部分索引和联合索引。
- 不在结果集单一的字段上建索引,比如sex,作用不会太大。
- 建索引的字段结果集最好分布均匀,或者符合正太分布。