Mysql的explain之Extra字段讲解
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Mysql的explain之Extra字段讲解,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2737字,纯文字阅读大概需要4分钟。
内容图文
认真阅读了一下explain之Extra字段,前2篇关于一道sql (select * from t where a=? and b>? order by c limit 0,100 ) 如何加索引的问题答案终于浮出水面
Using index
表示使用了覆盖索引,性能上会快很多
覆盖索引是指,索引上的信息足够满足查询请求,不需要再回到主键索引上去取数据。
Using index condition
与 Using index 的区别在于,用上了索引(利用索引完成字段的筛选过滤),但是索引列不能够包含查询要求的所有字段,需要回表补全字段
回表是指,根据索引找到满足条件的id后,利用id回到主键索引上取出整行或者取出需要的字段
Using filesort
表示的就是需要排序,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。
"排序"这个动作,可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数 sort_buffer_size。
sort_buffer_size,就是 MySQL 为排序开辟的内存(sort_buffer)的大小。如果要排序的数据量小于 sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不利用磁盘临时文件辅助排序。
-
全字段排序
可以通过 OPTIMIZER_TRACE结果 查看
"sort_mode": "<fixed_sort_key, additional_fields>"
-
rowid排序
如果sort_buffer中存放的字段数太多,会造成内存里能够同时放下的的行数很少,就会使用临时文件来进行排序,那么排序的效率就会很差
控制排序的单行长度设置(就表t来说,max_length_for_sort_data值大于等于22时,均采用全字段排序) 具体语法为SET max_length_for_sort_data = 21;
可以通过 OPTIMIZER_TRACE结果 查看
"sort_mode": "<fixed_sort_key, rowid>"
结论
上面3者的性能开销是依次放大的,也就是说尽可能让Extra中出现情况依次为
Using index > Using index condition > Using filesort
有了这个理论之后,我们再来解答前面2篇文章的结论(前2篇文章测试样例一致,这里只以第1篇结论进行解析)
idx_cab (c,a,b) / Using where; Using index
效果最好,不用回表,不用排序
idx_ac (a,c) / Using where
需要回表,不需要排序 (回表后完成b>5000的过滤条件)
idx_abc (a,b,c) / Using where; Using index; Using filesort
不需要回表,需要排序
idx_ab (a,b) / Using index condition; Using filesort
需要回表,需要排序 (回表前完成b>5000的过滤条件)
idx_a (a) / Using where; Using filesort
需要回表,需要排序 (回表后完成b>5000的过滤条件)
PRIMARY KEY (id
) / Using where; Using filesort
全表扫描,且需要排序
参考知识
前面提到的"全字段排序" “rowid排序” 一个sql到底使用的是哪种方式可以通过如下方式来查看:
/* 打开 optimizer_trace,只对本线程有效 */
SET optimizer_trace='enabled=on';
/* @a 保存 Innodb_rows_read 的初始值 */
select VARIABLE_VALUE into @a from performance_schema.session_status where variable_name = 'Innodb_rows_read';
/* 执行语句 */
select * from t where a=10 and b>50000 order by c limit 0,100 ;
/* 查看 OPTIMIZER_TRACE 输出 */
SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G
/* @b 保存 Innodb_rows_read 的当前值 */
select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name = 'Innodb_rows_read';
/* 计算 Innodb_rows_read 差值 */
select @b-@a;
内容总结
以上是互联网集市为您收集整理的Mysql的explain之Extra字段讲解全部内容,希望文章能够帮你解决Mysql的explain之Extra字段讲解所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。