四、MySql中explain的时候出现Using where; Using index; Using temporary; Using filesort
通过explain查看sql的执行计划时,Extra字段的值往往会看到Using where; Using index; Using temporary; Using filesort
一、using filesort
在使用order by关键字的时候,如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序。
【这个 filesort 并不是说通过磁盘文件进行排序,而只是告诉我们进行了一个排序操作而已】。
此时,可以进行的优化:
1、修改逻辑,不在mysql中使用order by而是在应用中自己进行排序。
2、使用mysql索引,将待排序的内容放到索引中,直接利用索引的排序。
filesort是通过相应的排序算法,将取得的数据在内存中进行排序:。
MySQL需要将数据在内存中进行排序,所使用的内存区域也就是我们通过sort_buffer_size 系统变量所设置的排序区。
这个排序区是每个Thread 独享的,所以说可能在同一时刻在MySQL 中可能存在多个 sort buffer 内存区域。
在MySQL中filesort 的实现算法实际上是有两种:
双路排序:是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在sort buffer 中进行排序。
单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序。
filesort使用的算法是QuickSort,即对需要排序的记录生成元数据进行分块排序,然后再使用mergesort方法合并块。其中filesort可以使用的内存空间大小为参数sort_buffer_size的值,默认为2M。当排序记录太多sort_buffer_size不够用时,mysql会使用临时文件来存放各个分块,然后各个分块排序后再多次合并分块最终全局完成排序。
二、Using temporary
Using temporary表示由于排序没有走索引、使用union、子查询连接查询、使用某些视图等原因。因此创建了一个内部临时表。注意这里的临时表可能是内存上的临时表,也有可能是硬盘上的临时表,理所当然基于内存的临时表的时间消耗肯定要比基于硬盘的临时表的实际消耗小。
查看sql执行时使用的是内存临时表还是硬盘临时表,需要使用如下命令:
mysql> show global status like '%tmp%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 5 |
| Created_tmp_tables | 11 |
+-------------------------+-------+
3 rows in set
Created_tmp_tables表示mysql创建的内部临时表的总数(包括内存临时表和硬盘临时表);
Created_tmp_disk_tables表示mysql创建的硬盘临时表的总数。
当mysql需要创建临时表时,选择内存临时表还是硬盘临时表取决于参数tmp_table_size和max_heap_table_size,内存临时表的最大容量为tmp_table_size和max_heap_table_size值的最小值,当所需临时表的容量大于两者的最小值时,mysql就会使用硬盘临时表存放数据。
用户可以在mysql的配置文件里修改该两个参数的值,两者的默认值均为16M。
tmp_table_size = 16M
max_heap_table_size = 16M
查看tmp_table_size和max_heap_table_size值:
mysql> show global variables like 'max_heap_table_size';
+---------------------+----------+
| Variable_name | Value |
+---------------------+----------+
| max_heap_table_size | 16777216 |
+---------------------+----------+
1 row in setmysql> show global variables like 'tmp_table_size';
+----------------+----------+
| Variable_name | Value |
+----------------+----------+
| tmp_table_size | 16777216 |
+----------------+----------+
1 row in set
三、using index
using index :使用覆盖索引的时候就会出现
四、useing where
using where:在查找使用索引的情况下,需要回表去查询所需的数据
四、MySql中explain的时候出现Using where; Using index; Using temporary; Using filesort相关推荐
- mysql中explain的使用,mysql使用方法_mysql中explain函数的使用方法
摘要 腾兴网为您分享:mysql中explain函数的使用方法,英语字典,小熊到家,腾讯新闻,刷机大师等软件知识,以及adobeflashplayerformac,灯光工厂,全民小视频,网盘解析,37 ...
- MySQL中EXPLAIN详解
EXPLAIN作为MySQL的性能分析神器,读懂其结果是很有必要的,然而我在各种搜索引擎上竟然找不到特别完整的解读.都是只有重点,没有细节(例如type的取值不全.Extra缺乏完整的介绍等). my ...
- mysql中explain命令
原文链接:https://blog.csdn.net/jiadajing267/article/details/81269067 其他文章: https://www.cnblogs.com/tufuj ...
- Mysql中explain命令查看语句执行概况
Mysql中可以使用explain命令查看查询语句的执行方式,使用方法举例:explain + 查询语句 例如:explain select * from user_info 几个重要的字段说明: t ...
- MySQL中Explain用法详解
Explain简介 我们在写后端程序的时候,通常会写sql来查询数据,如果是单表查询的时候,那直接select就完事了,但是如果是连表查询数据量也不小的话,就造成了查询速度会比较慢,那么我们该怎么知道 ...
- MySQL中EXPLAIN命令详解
EXPLAIN显示了MySQL如何使用索引来处理SELECT语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上EXPLAIN就可以了: 如: EXPLA ...
- mysql中explain的用法
最近在做性能测试中经常遇到一些数据库的问题,通常使用慢查询日志可以找到执行效果比较差的sql,但是仅仅找到这些sql是不行的,我们需要协助开发人员分析问题所在,这就经常用到explain explai ...
- 详解MySQL中EXPLAIN解释命令
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- mysql 输出解释怎么看_了解MySQL中EXPLAIN解释命令
1 EXPLAIN概念 EXPLAIN会向我们提供一些MySQL是执行sql的信息: EXPLAIN可以解释说明 SELECT, DELETE, INSERT, REPLACE, and UPDATE ...
最新文章
- [Notice]博客地址转移 vitostack.com
- 回归插补法_用均值替换、 回归插补及多重插补进行插补
- java.lang.Enum
- 大二暑假周进度总结03
- sleep( ) 和 wait( ) 的这 5 个区别,你知道几个
- cocos2dx libevent简介和使用
- 5.1.8 DELETE删除数据
- php : 工厂类演示
- TortoiseSVN 使用详细步骤(三):安装
- 使用C++编写一个DHT爬虫,实现从DHT网络爬取BT种子
- 解读HRP建设2.0时代:管控模型从未改变
- Win11查看本机WiFi密码
- 一文看懂,互联网这30年!
- cocos2dx游戏中添加背景音乐、音效
- 蓝桥杯,历届试题,九宫重排
- ubuntu python访问网络共享文件夹
- 管家婆物流配货单快速实现批量拣货
- 带你领略MotionLayout的魅力(中)
- 关于UVM中的Sequence(一)
- 线性回归、lasso回归、岭回归以及弹性网络的系统解释