mysql - 加快 mysql SQL 查询,但数据集庞大
问题描述
我有一个超过 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
问题是它需要超过 2.7 秒才能按预期返回 0 行。有没有办法加快速度?我还有 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"
解决方案
这对于评论来说有点大
将 Group by 与 Count 函数一起使用没有任何意义。通常你需要在聚合之后计算数据库中的实际行数。不确定这是否是您的实际需求原因,因为 GROUP BY 会导致查询速度变慢。
在 (Web, start_date) 上使用复合索引,因为列项目似乎具有最高的选择性。
其他信息,请分享解释计划。
推荐阅读
- laravel - Laravel - 将值传递给注册表单
- angular - 角度错误:“模板解析错误:解析器错误:缺少预期:”
- react-native - onChangeText 返回之前的状态值
- transactions - Quarks 反应式 Postgresql 事务
- .net - 该事件只能出现在 += 或 -= dotnetstandard 2.1 的左侧
- python - Python:根据两个表中的部分文本匹配加入 2 个表
- rebus - Rebus SqlServerTransportOptions
- python-3.x - 我正在使用 selenium(python 模块(3.8))打开 DocDroid.net 网站并从我的桌面发送 PDF 文件。但我收到以下错误
- sqlite - 无论时区如何,如何在 sqlite 中搜索一小时?
- php - JQUERY ajax 更新 laravel 中的字段不起作用