MySQL 优化 之 Copying to tmp table on disk
项目中遇到了慢查询问题
Sql语句
SELECT
sum(price) AS price,
`member_id`
FROM
`crm_upload`
GROUP BY
member_id
ORDER BY
price DESC
LIMIT 10;
Explain 之后的结果:
MariaDB [member]> explain SELECT sum(price) as price,`member_id` FROM `crm_upload` WHERE `status` = 1 AND `approved` = 1 AND `consume_time` > '2015-09-10' GROUP BY member_id ORDER BY price desc LIMIT 10;
+------+-------------+------------+------+---------------+------+---------+------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+------------+------+---------------+------+---------+------+--------+----------------------------------------------+
| 1 | SIMPLE | crm_upload | ALL | NULL | NULL | NULL | NULL | 310461 | Using where; Using temporary; Using filesort |
+------+-------------+------------+------+---------------+------+---------+------+--------+----------------------------------------------+
1 row in set (0.00 sec)
关于 Using temporary; 手册解释
To resolve the query, MySQL needs to create a temporary table to hold the result. This typically happens if the query contains GROUP BY and ORDER BY clauses that list columns differently.
大意是,需要一个临时表来暂存查询后的结果,经常会出现在Group By 或者 Order By 中
关于 Using filesort;手册解释
MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows
according to the join type and storing the sort key and pointer to the row for all rows that match the WHEREclause. The keys then are sorted
and the rows are retrieved in sorted order.
大意是 Mysql 如果想要正常的查找出排序中的数据,需要做一个额外的传递。这个排序将根据join的类型遍历所有的数据,并且存储排序的key。找出匹配到的where条件的数据。
show profile
MariaDB [member]> show profile;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000037 |
| Waiting for query cache lock | 0.000008 |
| init | 0.000006 |
| checking query cache for query | 0.000103 |
| checking permissions | 0.000011 |
| Opening tables | 0.000029 |
| After opening tables | 0.000010 |
| System lock | 0.000008 |
| Table lock | 0.000007 |
| After opening tables | 0.000012 |
| Waiting for query cache lock | 0.000006 |
| After opening tables | 0.000041 |
| init | 0.000044 |
| optimizing | 0.000016 |
| statistics | 0.000244 |
| preparing | 0.000116 |
| executing | 0.000015 |
| Copying to tmp table | 0.000061 |
| Copying to tmp table | 0.138350 |
| converting HEAP to Aria | 0.003233 |
| Creating index | 0.000025 |
| Repair by sorting | 0.020695 |
| Saving state | 0.000040 |
| Creating index | 0.000005 |
| converting HEAP to Aria | 0.000070 |
| Copying to tmp table on disk | 4.040516 |
| Sorting result | 0.020373 |
| Sending data | 0.000046 |
| end | 0.000003 |
| removing tmp table | 0.000838 |
| end | 0.000013 |
| query end | 0.000008 |
| closing tables | 0.000010 |
| freeing items | 0.000006 |
| updating status | 0.000003 |
| Waiting for query cache lock | 0.000002 |
| updating status | 0.000715 |
| Waiting for query cache lock | 0.000015 |
| updating status | 0.000002 |
| storing result in query cache | 0.000014 |
| logging slow query | 0.000053 |
| cleaning up | 0.000017 |
+--------------------------------+----------+
可以看到
Copying to tmp table on disk 花费了大量的时间。
结果查找资料后 了解到 发现mysql可以通过变量tmp_table_size和max_heap_table_size来控制内存表大小上限,如果超过上限会将数据写到磁盘上,从而会有物理磁盘的读写操作,导致影响性能。
调整参数配置之后 就不会有这个问题了。
- To set max_heap_table_size to 64M do the following:
SET max_heap_table_size = 1024 * 1024 * 64;
- To set tmp_table_size to 32M do the following:
SET tmp_table_size = 1024 * 1024 * 32;
MySQL 优化 之 Copying to tmp table on disk的更多相关文章
- [MySQL优化2]不用SELECT * FROM table;
假设有一张employees表,它有8列:员工人数,姓氏,名字,分机,电子邮件,办公室代码,报告,职位等.如果要仅查看员工的名字,姓氏和职位,请使用以下查询:SELECT lastname, firs ...
- MySQL优化技巧之五(mysql查询性能优化)
对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐 ...
- mysql优化一之查询优化
这一篇笔记的mysql优化是注重于查询优化,根据mysql的执行情况,判断mysql什么时候需要优化,关于数据库开始阶段的数据库逻辑.物理结构的设计结构优化不是本文重点,下次再谈 查看mysql语句的 ...
- [转]mysql优化——show processlist命令详解
本文转自:https://blog.csdn.net/sunqingzhong44/article/details/70570728 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...
- mysql优化——show processlist命令详解
SHOW PROCESSLIST显示哪些线程正在运行 不在mysql提示符下使用时用mysql -uroot -e 'Show processlist' 或者 mysqladmin pro ...
- Mysql优化_内置profiling性能分析工具
如果要进行SQL的调优优化和排查,第一步是先让故障重现,但是这个并不是这一分钟有问题,下一秒就OK.一般的企业一般是DBA数据库工程师从监控里找到问题.DBA会告诉我们让我们来排查问题,那么可能很多种 ...
- Mysql优化实践(分页优化)
当你和别人都能实现一个某个功能,这时候区分你们能力的不是谁干活多少,而是谁能写出效率更高的代码.比如显示一个订单列表它不仅仅是写一条SELECT SQL那么简单,我们还需要很清楚的知道这条SQL他大概 ...
- 【mysql优化】大数据量分页优化
limit 翻页原理 limit offset,N, 当offset非常大时, 效率极低, 原因是mysql并不是跳过offset行,然后单取N行, 而是取offset+N行,返回放弃前offset行 ...
- Mysql优化系列之查询性能优化前篇2
接前一篇,这一篇主要总结下几个经常要用的命令 命令一:explain+sql mysql> explain select * from servers; +----+-------------+ ...
随机推荐
- java 强大的反射机制
这段时间,在对接一个开源的版本时,发现由于依赖的开源版本api老是随着版本的变化而变化,导致代码经常需要修改,异常痛苦. 终于,在一个风和日丽的下午(五月末的广州异常暴晒),楼主下定决心要修掉这个大篓 ...
- robotframework自动化系列:登陆操作
robotframework自动化系统:登录 robotframework对于编程能力比较弱的测试人员而言,真的是雪中送炭!我们可以使用robotframework根据之前完成的测试用例,一步步完善自 ...
- NOIp2016 蚯蚓 【二叉堆/答案单调性】By cellur925
题目传送门 $Sol$ $50pts$:我们考虑$q==0$的情况,每次在所有的蚯蚓中找到一只长度最大的,这非常二叉堆.所以我们可以用一个优先队列,随便水一下就有50分.($NOIp$的分真这么好拿? ...
- tuple的用法,set的用法
项目中需要遍历tuple,而tuple的元素也是tuple,这样就会出现一些问题 当有多个元素的时候并没有问题,比如 tuple1 = ((1,2),(1,2)) for first, second ...
- oracle 查看未关闭连接
查看连接状态.问题电脑等信息: select sid,serial#,username,program,machine,status from v$session; 2.查看sql; select ...
- 在 Windows 7 中禁用IPv6协议/IPv6隧道
How to disable certain Internet Protocol version 6 (IPv6) components in Windows Vista, Windows 7 and ...
- netcdf源码在windows上的编译
作者:朱金灿 来源:http://blog.csdn.net/clever101 今天搞搞netcdf源码在windows上的编译,折腾了半天,算是搞成了,特地记录一下过程.我的目标是要生成netcd ...
- java5增加对https的支持
jdk1.5不支持http协议,jdk1.8默认支持,比较好的解决方案是升级jdk,但是升级jdk风险极大.不能升级jdk的情况下,可以使用如下方式. 利用httpclient,进行封装,从而实现对h ...
- 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753
下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...
- libs/tools.js stringToDate dateToString 日期字符串转换函数
libs/tools.js stringToDate dateToString 日期字符串转换函数 import { stringToDate } from '@/libs/tools.js' e ...