搜尋
首頁資料庫mysql教程减少不必要的group by字段

我们可以看到没有去掉多余字段前 Sorting for group和Copying to tmp table占用了大部分io和cpu,而去掉后Copying to tmp table占

后台某维度统计语句
SELECT products_id, sku, px_id, sj_id, cat_path, COUNT(*) AS pv, COUNT(DISTINCT ip) AS ip_numbers, SUM(is_bounce) AS bounce_numbers, SUM(remain_time) AS remain_time
    FROM dm_pv_records_search
    WHERE 1 AND add_date >= '2014-02-26 10:00:00' AND products_id > 0
GROUP BY products_id,sku, px_id, sj_id, cat_path
order by ip_numbers desc limit  0,20;

每次有同事在后台查询这类数据时,都反应数据非常慢,偶尔不能出来数据。

explain
+----+-------------+----------------------+-------+----------------------+----------+---------+------+---------+----------------------------------------------+
| id | select_type | table                | type  | possible_keys        | key      | key_len | ref  | rows    | Extra                                        |
+----+-------------+----------------------+-------+----------------------+----------+---------+------+---------+----------------------------------------------+
|  1 | SIMPLE      | dm_pv_records_search | range | products_id,add_date | add_date | 8      | NULL | 12831019 | Using where; Using temporary; Using filesort |
+----+-------------+----------------------+-------+----------------------+----------+---------+------+---------+----------------------------------------------+

这条语句索引使用是正确的,不过结果集及其大,而且需要对结果集group by操作。

观察该sql语句发现,sku,px_id,sj_id,cat_path四个字段为冗余字段,,都可以从其他表连表获得。

而改sql又存在order by .. limit m,n,可知道后期结果集只有20个,更加适合后期连接相关表获取其他必要的字段sku,px_id,sj_id,cat_path。
如此一转换,可以将group by中的sku,px_id,sj_id,cat_path去掉(其中sku和cat_path为字符串),节省后期大结果集中排序的内存。
而group by和distinct优化的一种方式是,尽量减少不必要的字段,可以参考简朝阳写的《MySQL性能调优和架构设计》的第8.6小结,或者参考以下连接: 。

我们可以尝试将sql改成
SELECT products_id, COUNT(*) AS pv, COUNT(DISTINCT ip) AS ip_numbers, SUM(is_bounce) AS bounce_numbers, SUM(remain_time) AS remain_time
    FROM dm_pv_records_search
    WHERE 1 AND add_date >= '2014-02-26 10:00:00' AND products_id > 0
GROUP BY products_id
order by ip_numbers desc limit  0,20;

对比两次profiling,前者执行时间是58s,后者执行时间是5s.
前者profiling如下
+----------------------+-----------+----------+------------+--------------+---------------+
| Status              | Duration  | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+----------------------+-----------+----------+------------+--------------+---------------+
| starting            |  0.000133 | 0.000000 |  0.000000 |            0 |            0 |
| checking permissions |  0.000014 | 0.000000 |  0.000000 |            0 |            0 |
| Opening tables      |  0.000031 | 0.000000 |  0.000000 |            0 |            0 |
| System lock          |  0.000018 | 0.000000 |  0.000000 |            0 |            0 |
| init                |  0.000061 | 0.000000 |  0.000000 |            0 |            0 |
| optimizing          |  0.000019 | 0.000000 |  0.000000 |            0 |            0 |
| statistics          |  0.000073 | 0.000000 |  0.000000 |            0 |            0 |
| preparing            |  0.000051 | 0.000000 |  0.000000 |            0 |            0 |
| Creating tmp table  |  0.000051 | 0.000000 |  0.000000 |            0 |            0 |
| Sorting for group    | 47.735389 | 4.614299 |  10.773362 |        3632 |      2811456 |
| executing            |  0.000010 | 0.000000 |  0.000000 |            0 |            0 |
| Copying to tmp table | 11.566292 | 0.910861 |  0.586911 |          256 |          4408 |
| Sorting result      |  0.030459 | 0.025996 |  0.004000 |            0 |            0 |
| Sending data        |  0.000057 | 0.000000 |  0.000000 |            0 |            0 |
| end                  |  0.000005 | 0.000000 |  0.000000 |            0 |            0 |
| removing tmp table  |  0.008139 | 0.000000 |  0.008998 |            0 |            0 |
| end                  |  0.000007 | 0.000000 |  0.000000 |            0 |            0 |
| query end            |  0.000004 | 0.000000 |  0.000000 |            0 |            0 |
| closing tables      |  0.000011 | 0.000000 |  0.000000 |            0 |            0 |
| freeing items        |  0.000071 | 0.000000 |  0.000000 |            0 |            0 |
| removing tmp table  |  0.000006 | 0.000000 |  0.000000 |            0 |            0 |
| freeing items        |  0.000331 | 0.000000 |  0.000000 |            0 |            0 |
| logging slow query  |  0.000006 | 0.000000 |  0.000000 |            0 |            0 |
| logging slow query  |  0.000047 | 0.000000 |  0.000000 |            0 |            8 |
| cleaning up          |  0.000005 | 0.000000 |  0.000000 |            0 |            0 |
+----------------------+-----------+----------+------------+--------------+---------------+

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
深入理解MySQL索引优化器工作原理深入理解MySQL索引优化器工作原理Nov 09, 2022 pm 02:05 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于索引优化器工作原理的相关内容,其中包括了MySQL Server的组成,MySQL优化器选择索引额原理以及SQL成本分析,最后通过 select 查询总结整个查询过程,下面一起来看一下,希望对大家有帮助。

sybase是什么数据库sybase是什么数据库Sep 22, 2021 am 11:39 AM

sybase是基于客户/服务器体系结构的数据库,是一个开放的、高性能的、可编程的数据库,可使用事件驱动的触发器、多线索化等来提高性能。

visual foxpro数据库文件是什么visual foxpro数据库文件是什么Jul 23, 2021 pm 04:53 PM

visual foxpro数据库文件是管理数据库对象的系统文件。在VFP中,用户数据是存放在“.DBF”表文件中;VFP的数据库文件(“.DBC”)中不存放用户数据,它只起将属于某一数据库的 数据库表与视图、连接、存储过程等关联起来的作用。

数据库系统的构成包括哪些数据库系统的构成包括哪些Jul 15, 2022 am 11:58 AM

数据库系统由4个部分构成:1、数据库,是指长期存储在计算机内的,有组织,可共享的数据的集合;2、硬件,是指构成计算机系统的各种物理设备,包括存储所需的外部设备;3、软件,包括操作系统、数据库管理系统及应用程序;4、人员,包括系统分析员和数据库设计人员、应用程序员(负责编写使用数据库的应用程序)、最终用户(利用接口或查询语言访问数据库)、数据库管理员(负责数据库的总体信息控制)。

group by什么意思group by什么意思Mar 09, 2023 pm 06:37 PM

group by的意思为“分组查询”,可以理解为“根据(by)一定的规则进行分组(Group)”;作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。在MySQL中,GROUP BY是SELECT语句的可选子句,用于根据一个或多个字段对查询结果进行分组,它减少了结果集中的行数。

数据库的什么是指数据的正确性和相容性数据库的什么是指数据的正确性和相容性Jul 04, 2022 pm 04:59 PM

数据库的“完整性”是指数据的正确性和相容性。完整性是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。完整性对于数据库系统的重要性:1、数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据;2、合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能;3、完善的数据库完整性有助于尽早发现应用软件的错误。

go语言可以写数据库么go语言可以写数据库么Jan 06, 2023 am 10:35 AM

go语言可以写数据库。Go语言和其他语言不同的地方是,Go官方没有提供数据库驱动,而是编写了开发数据库驱动的标准接口,开发者可以根据定义的接口来开发相应的数据库驱动;这样做的好处在于,只要是按照标准接口开发的代码,以后迁移数据库时,不需要做任何修改,极大方便了后期的架构调整。

access数据库的结构层次是什么access数据库的结构层次是什么Aug 26, 2022 pm 04:45 PM

结构层次是“数据库→数据表→记录→字段”;字段构成记录,记录构成数据表,数据表构成了数据库。数据库是一个完整的数据的记录的整体,一个数据库包含0到N个表,一个表包含0到N个字段,记录是表中的行。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
1 個月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器