MySql优化2——索引与性能分析

时间:2023-01-10 06:07:02

一、通过命令查看性能分析报告

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,作用不会太大。
  • 建索引的字段结果集最好分布均匀,或者符合正太分布。

推荐:

MySql优化1——SQL语句优化
MySql优化3——服务器与配置优化