使用 sum 和 group by 选项的 Mysql 查询运行速度非常慢

Posted

技术标签:

【中文标题】使用 sum 和 group by 选项的 Mysql 查询运行速度非常慢【英文标题】:Mysql query running very slow with sum and group by option 【发布时间】:2018-11-20 06:54:04 【问题描述】:

mysql 查询运行很慢。 表中有 1000000 行。我在问题中添加了解释查询。这需要 10-11 秒。我有多个条件不断改变用户的输入。是否可以提供唯一索引。 解释查询 id -1 select_type -简单 表 - 卖家 类型 -ref 可能的键-季度,季度_2,comp_idx1,index_all,qc 关键 -qc key_len -32 参考 -const 行 -399782 额外 - 使用 where

SELECT `cm`, 
       `week`, 
       `quarter`,
       SUM( `gmv`) as gmv, 
       SUM( `qty_sold`) as qty_sold, 
       SUM( `live_listing`) as live_listing , 
       SUM( `txn`) as txn, 
       SUM( `new_listings`) as new_listings, 
       SUM( `ended_listings`) as ended_listings 
FROM `sellers` 
where quarter=:quarter and 
      category=:category 
group by cm

CREATE TABLE `sellers` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `seller_id` varchar(20) NOT NULL,
 `am` varchar(30) NOT NULL,
 `rm` varchar(30) NOT NULL,
 `cm` varchar(30) NOT NULL,
 `week` varchar(10) NOT NULL,
 `quarter` varchar(10) NOT NULL,
 `site` varchar(20) NOT NULL,
 `category` varchar(20) NOT NULL,
 `format` varchar(20) NOT NULL,
 `price_band` varchar(20) NOT NULL,
 `gmv` double(11,2) NOT NULL,
 `qty_sold` int(11) NOT NULL,
 `live_listing` int(11) NOT NULL,
 `txn` int(11) NOT NULL,
 `new_listings` int(11) NOT NULL,
 `ended_listings` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `seller_id` (`seller_id`),
 KEY `quarter` (`quarter`),
 KEY `week` (`week`),
 KEY `id` (`id`),
 KEY `category` (`category`),
 KEY `site` (`site`),
 KEY `cm` (`cm`),
 KEY `rm` (`rm`),
 KEY `am` (`am`)
) ENGINE=InnoDB AUTO_INCREMENT=1692618 DEFAULT CHARSET=utf8

【问题讨论】:

“非常慢”的定义是什么?目前需要多少时间?此外,将EXPLAIN 语句结果添加到当前查询的问题中。 请通过编辑将这些详细信息添加到问题中。所有格式都在 cmets 中丢失,使其无法读取。 在 group byu 语句后使用 order by null 通常,您应该在 GROUP BY 中包含 SELECT 中的任何和所有非聚合列 @Strawberry 我没听懂。 【参考方案1】:

您可以为“cm”列添加索引。会比以前更快

【讨论】:

【参考方案2】:

在特定查询中,MySQL 一次只能使用一个索引。在您的情况下,您有多个列要检查。您需要在(quarter, category, cm) 上添加一个综合索引,以获得更好的性能:

ALTER TABLE sellers 
ADD INDEX comp_idx1(quarter, category, cm);

【讨论】:

如果我删除类别条件它会失败。我们有各种(5-6)个参数放在条件中。从过滤器中删除类别后,我又添加了一个索引。 ALTER TABLE 卖家添加索引 qc(季度,厘米)仍然无法正常工作。 @ManishMalviya “它不工作”是什么意思?请指定查询运行的持续时间?将EXPLAIN 语句结果添加到问题中,以便进一步分析。 解释sql结果。并查询需要 10 秒。 id - 1 select_type -SIMPLE table Sellers type ref possible_keys quarter,quarter_2,comp_idx1,index_all,qc key qc key_len 32 ref const rows 399782 Extra Using where @dwir182 已添加。 我认为 sum 函数需要很多时间。

以上是关于使用 sum 和 group by 选项的 Mysql 查询运行速度非常慢的主要内容,如果未能解决你的问题,请参考以下文章

EF LINQ Group By 和 Sum

关于SQL中两张表联合sum和group by的查询问题

Drupal 使用 group by 和 sum 查看查询

MySQL 条件 SUM 使用 GROUP BY 和 DISTINCT

使用带有 SUM 和 GROUP BY 的完整 JOIN 避免重复条目

SQL sum()后许多字段要group by不使用group by, 改用left join select 需要的字段。哪个方法好?速度快?