繁体   English   中英

加速 mysql SQL 查询,但具有庞大的数据集

[英]Speed up mysql SQL query but with a huge dataset

我有一个超过 250 万行的表,我想运行以下 SQL 语句来获取

select count(*) 
  from workflow 
 where action_name= 'Workflow' 
   and release_date >= '2019-12-01 13:24:22' 
   and release_date <= '2019-12-31 13:24:22' 
   AND project_name= 'Web' 
 group 
    by page_id
     , headline
     , release_full_name
     , release_date

问题是按预期返回 0 行需要 2.7 秒以上。 有没有办法加快速度? 我还有 6 个类似的 SQL 语句,因此至少需要几乎 (2.7 秒 * 6) = 17 秒。

这是我的表架构

CREATE TABLE workflow (
 id int(11) NOT NULL AUTO_INCREMENT,
 action_name varchar(100) NOT NULL,
 project_name varchar(30) NOT NULL,
 page_id int(11) NOT NULL,
 headline varchar(200) NOT NULL,
 create_full_name varchar(200) NOT NULL,
 create_date datetime NOT NULL,
 change_full_name varchar(200) NOT NULL,
 change_date datetime NOT NULL,
 release_full_name varchar(200) NOT NULL,
 release_date datetime NOT NULL,
 reject_full_name varchar(200) NOT NULL,
 reject_date datetime NOT NULL,
 PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=2948271 DEFAULT CHARSET=latin1

在此处输入图片说明 我在此查询中寻找的是获取上个月发布的页面数。 具有 project_name = "web" 和 action_name = "Workflow"

这对于评论来说有点大

  1. 将 Group by 与 Count 函数一起使用没有任何意义。 通常,您需要在聚合后计算 DB 中的实际行数。 不确定这是否是您的实际需求原因 GROUP BY 导致查询缓慢。

  2. 在 (Web, start_date) 上使用复合索引,因为列项目似乎具有最高的选择性。

有关其他信息,请分享解释计划。

假设您需要对组进行计数(您已列出),最好将组字段包含在选择(基本上)中

select page_id, headline, release_full_name, release_date, count(*) 
  from ...

添加带有 (page_id, title) 的索引会优化得很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM