项目中遇到了慢查询问题

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的更多相关文章

  1. [MySQL优化2]不用SELECT * FROM table;

    假设有一张employees表,它有8列:员工人数,姓氏,名字,分机,电子邮件,办公室代码,报告,职位等.如果要仅查看员工的名字,姓氏和职位,请使用以下查询:SELECT lastname, firs ...

  2. MySQL优化技巧之五(mysql查询性能优化)

    对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐 ...

  3. mysql优化一之查询优化

    这一篇笔记的mysql优化是注重于查询优化,根据mysql的执行情况,判断mysql什么时候需要优化,关于数据库开始阶段的数据库逻辑.物理结构的设计结构优化不是本文重点,下次再谈 查看mysql语句的 ...

  4. [转]mysql优化——show processlist命令详解

    本文转自:https://blog.csdn.net/sunqingzhong44/article/details/70570728 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...

  5. mysql优化——show processlist命令详解

    SHOW PROCESSLIST显示哪些线程正在运行 不在mysql提示符下使用时用mysql -uroot  -e 'Show  processlist'   或者   mysqladmin pro ...

  6. Mysql优化_内置profiling性能分析工具

    如果要进行SQL的调优优化和排查,第一步是先让故障重现,但是这个并不是这一分钟有问题,下一秒就OK.一般的企业一般是DBA数据库工程师从监控里找到问题.DBA会告诉我们让我们来排查问题,那么可能很多种 ...

  7. Mysql优化实践(分页优化)

    当你和别人都能实现一个某个功能,这时候区分你们能力的不是谁干活多少,而是谁能写出效率更高的代码.比如显示一个订单列表它不仅仅是写一条SELECT SQL那么简单,我们还需要很清楚的知道这条SQL他大概 ...

  8. 【mysql优化】大数据量分页优化

    limit 翻页原理 limit offset,N, 当offset非常大时, 效率极低, 原因是mysql并不是跳过offset行,然后单取N行, 而是取offset+N行,返回放弃前offset行 ...

  9. Mysql优化系列之查询性能优化前篇2

    接前一篇,这一篇主要总结下几个经常要用的命令 命令一:explain+sql mysql> explain select * from servers; +----+-------------+ ...

随机推荐

  1. Log2Net的架构简介

    在开始介绍源码之前,我们有必要了解下整个系统的大致需求,设计架构,观其大略,这样才能从总体上把握为何细节上要如此设计,不至于在代码的海洋中迷失,时不时吐槽为何要这么多代码.高屋建瓴地把控系统的全局,孜 ...

  2. Firefox下载安装fireBug提示下载出错的解决方案

    火狐官方扩展中心在国外,国内可能访问某一节点出现了问题.所以可能扩展无法安装,并且扩展更新可能出现问题,导致启动检查扩展更新过慢影响启动.我们可以通过修改系统hosts文件加速访问.修改hosts文件 ...

  3. 用NPOI从DataTable到Excel,向Excel模板填充数据

    DataTable---->Excel,填充数据 private IWorkbook workbook = null; private ISheet sheet = null; private ...

  4. C# 部分命名规则

    接触C#开发已经四个月,整理下C#中的命名规则: 一:变量的命名规则(和Java相似) 1.变量名由字母.数字.下划线组成 2.变量名开头只能以字母.下划线开头,不能以数字开头 3.区分大小写 4.命 ...

  5. AJPFX关于一维数组的声明与初始化

    一维数组:可以理解为一列多行.类型相同的数据,其中每个数据被称为数组元素:一维数组的声明方式:                type varName[]; 或 type[] varName;(推荐) ...

  6. 02全志r58平台Android4.4.4下关闭内核中的CPU的开启关闭提示

    02全志r58平台Android4.4.4下关闭内核中的CPU的开启关闭提示 2017/8/18 13:53 版本:V1.0 开发板:SC5806(全志R58平台) SDK:android4.4.4 ...

  7. 在自己的工程中使用ijkplayer的功能

    最近在做一个软解视频叠加硬解视频的方案,网上看了很多教程,始终不得要领.虽然ijkplayer提供了ijkplayer-example这个示例工程,但对于初入安卓的人来说,要将ijkplayer整合到 ...

  8. How the performance impacts your revenue-性能影响营收

    看完国外一个APM厂商最后的一个业务介绍视频,终于想通了PE领域中最顶层的应用目标,也就是如标题所云.那么这个影响效果是如何做到的?最终的步骤其实很简单,也就是利用大数据进行分析.而自己先前还没有想到 ...

  9. bt5r3安装postgresql

    apt-get install postgresql

  10. 你的项目刚刚启动?是时候考虑Globalization了!

    今天继续由SAP成都研究院非典型程序猿, 菜园子小哥王聪给大家带来分享. 关于这个很长的定语的由来,请参考这篇文章,里面有王聪的背景介绍,包括他种菜的特长:当我用UI5诊断工具时我用些什么. 秋天到了 ...