Mysql 索引与 SQL 语句索引有没生效分析

Mysql sql 执行效率的分析,Explain sql 各个字段显示的数据的剖析。

Mysql 索引与 SQL 语句索引有没生效分析

查看 sql 执行效率

1
2
3
4
5
6
7
8
mysql > set @@profiling = 1;
mysql > select * from user;
mysql > show profiles;
mysql > select * from user;
mysql > show profiles;

mysql > show profile for query 6;
mysql > show profile for query 7;

性能分析图

使用 EXPLAIN 查看查询语句

id : 查询的序列号

select_type : 查询的类型,主要包括普通的查询、联合查询和子查询

table: 所访问数据库的 table

type : 联合查询使用的类型(一般来讲,保证查询至少达到 range 级别,最好能到 ref 级,all 是全表扫描,是最坏打算)
system(系统表) >
const(读常量) >
eq_ref(最多一条结果,通常是通过主键访问) >
ref(被驱动表索引引用) >
fulltext(全文索引检索) >
ref_or_null(带空值的索引查询) >
index_merge(合并索引结果集) >
unique_subquery(子查询中返回的字段是唯一组合或索引) >
index_subquery(子查询返回的索引,但非主键) >
range(索引范围扫描) >
index(全索引扫描) >
ALL (全表扫描)

possible_keys : 指出是通过哪个索引找到这行,如果为空,表示没使用索引,这是要提高性能,可通过检验 where 字句,看是否引用了某段字段,或者检查字段是否适合索引

key : 显示实际决定使用的键,如果没有索引被选择,键是 null

key_len: 显示决定使用的键长度,如果null,长度就为 null。注意,这个值可以反印出一个多重主键里实际使用了哪个部分

ref: 显示哪个字段或常数与 key 一起被使用

rows: 这个值表示要遍历多少数据才能找到所需的结果集,其在 innoDB 是不准确的。

extra:
如果是 only index,意味着信息只能用索引书中的信息检索,这比扫描整个表要快;
如果是 where use ,表示使用了 where 限制,但是用索引还不够怕;
如果是 impossible where ,则表示通过手机到的统计信息判断出不可能存在的结构;
如果是 Using filesort ,表示 orderby 且无法使用索引进行派讯操作,不得不使用相应的派讯算法实现
如果是 Using temporary ,使用临时表,常见于 order by 和 group by
如果是 select tables optimized way ,使用聚合函数,并且进行快速定位。

索引建立和使用的基本原则如下

  • 合理设计和使用索引

  • 在关键字段的索引上,建与不建索引,查询速度相差近 100 倍

  • 差的索引和没有索引效果一样

  • 索引并非越多越好,因为维护索引需要成本

  • 每个表的索引应在 5 个以下,应合理利用部分索引和联合索引

  • 不在结果集中的结果单一的列上建索引。比如性别字段只能 0 和 1 两种结果集,在这个字段上建索引并不会有太多帮助

  • 建索引的字段结果集最好分布均匀,或者符合正态分布。

文章对你有用?给博主一个支持
0%