Loading... # Mysql 索引与 SQL 语句索引有没生效分析 --- ## 查看 sql 执行效率 ```mysql 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; ``` ![性能分析图](http://image-blog-markdown.test.upcdn.net/2019_markdown/show_mysql_profiles.jpg!min) ![](http://image-blog-markdown.test.upcdn.net/2019_markdown/show_profiel2.jpg!min) ![](http://image-blog-markdown.test.upcdn.net/2019_markdown/show_profile1.jpg!min) ## 使用 EXPLAIN 查看查询语句 ![](http://image-blog-markdown.test.upcdn.net/2019_markdown/explain_select.jpg) > 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 两种结果集,在这个字段上建索引并不会有太多帮助 * 建索引的字段结果集最好分布均匀,或者符合正态分布。 © Allow specification reprint Support Appreciate the author AliPayWeChat Like If you think my article is useful to you, please feel free to appreciate