gpt4 book ai didi

mysql - 优化 MySQL 查询性能

转载 作者:行者123 更新时间:2023-11-29 05:12:02 26 4
gpt4 key购买 nike

我的解决方案:在@Alex 的帮助下

我向表中添加了 3 个新列,将它们命名为年(YYYY)、月(YYYY-MM)和日(YYYY-MM-DD),并向表中添加了 3 个索引:

alter table vaadin_table add index (year, status);
alter table vaadin_table add index (month, status);
alter table vaadin_table add index (day, status);

现在我的查询是:

select year,status, count(1) from vaadin_table group by year, status;
select month,status, count(1) from vaadin_table group by month, status;
select day,status, count(1) from vaadin_table group by day, status;

我可以在 2 秒内得到结果!感谢您的所有帮助,非常感谢!似乎 Mysql 不支持索引列上的函数,这使得我原来的帖子查询不起作用

编辑:感谢所有回复。

为了让我的问题更清楚。我需要从表中获取每日/每月/每年的统计数据。

因此我使用下面的顺序按日/月/年数据分组:

substring(entry_date,1, 11) ---> YYYY-MM-DD

substring(entry_date,1, 7) ---> YYYY-MM

substring(entry_date,1, 4) ---> YYYY

所有这 3 列都让我的查询变慢。

原始问题:我有一个 270 万行的表。它包含 3 列:名称、状态和 entry_date(YYYY-MM-DD HH:MM:SS)

CREATE TABLE IF NOT EXISTS test_table 
(id integer not null auto_increment primary key,
name char(20) not null, status char(20) not null,
entry_date datetime default 0);

我的目的是获取每个状态的每日数量:

SELECT substring(entry_date, 1, 11), status, count(1) 
FROM test_table
GROUP BY
substring(entry_date, 1, 11), status;

它工作正常,但需要大约 10 秒才能返回结果。

为了优化它,我将索引添加到表中:

ALTER table test_table ADD INDEX test_index(entry_date, status);

网上看了一些类似的问题,都是建议按顺序分组加索引。但这对我的情况没有帮助。是因为我使用的是 entry_date 的子字符串吗?

求助,谢谢

最佳答案

SELECT entry_date, status, count(1) 
FROM test_table
GROUP BY
DATE(entry_date), status;

或者甚至更好地添加带有 DATE 类型的额外列

ALTER TABLE test_table ADD COLUMN entry_date1 DATE;
UPDATE test_table SET entry_date1=DATE(entry_date);

SELECT entry_date1, status, count(1)
FROM test_table
GROUP BY
entry_date1, status;

关于mysql - 优化 MySQL 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38105707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com