优化 MySQL 查询性能
Optimize MySQL query performance
我的解决方案:
在@Alex 的帮助下
我向 table 添加了 3 个新列,将它们命名为年 (YYYY)、月 (YYYY-MM) 和日 (YYYY-MM-DD) 并向 [=69= 添加了 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 不支持索引列上的函数,这使得我原来的 post 查询不起作用
编辑:
感谢大家的回复。
为了让我的问题更清楚。我需要从 table.
中获取 daily/monthly/yearly 统计数据
因此我使用下面的顺序按 daily/monthly/yearly 数据分组:
子字符串(entry_date,1, 11) ---> YYYY-MM-DD
substring(entry_date,1, 7) ---> YYYY-MM
子字符串(entry_date,1, 4) ---> YYYY
所有这 3 列使我的查询变慢。
原问题:
我有 270 万行 table。它包含 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 秒才能 return 结果。
为了优化它,我将索引添加到 table 为:
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
type
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;
为了优化,我的建议如下
更改查询
SELECT date(entry_date), status, count(1)
FROM test_table
GROUP BY
status,date(entry_date);
然后按以下列顺序创建索引
ALTER table test_table ADD INDEX test_index( status,entry_date);
我的解决方案: 在@Alex 的帮助下
我向 table 添加了 3 个新列,将它们命名为年 (YYYY)、月 (YYYY-MM) 和日 (YYYY-MM-DD) 并向 [=69= 添加了 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 不支持索引列上的函数,这使得我原来的 post 查询不起作用
编辑: 感谢大家的回复。
为了让我的问题更清楚。我需要从 table.
中获取 daily/monthly/yearly 统计数据因此我使用下面的顺序按 daily/monthly/yearly 数据分组:
子字符串(entry_date,1, 11) ---> YYYY-MM-DD
substring(entry_date,1, 7) ---> YYYY-MM
子字符串(entry_date,1, 4) ---> YYYY
所有这 3 列使我的查询变慢。
原问题: 我有 270 万行 table。它包含 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 秒才能 return 结果。
为了优化它,我将索引添加到 table 为:
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
type
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;
为了优化,我的建议如下
更改查询
SELECT date(entry_date), status, count(1)
FROM test_table
GROUP BY
status,date(entry_date);
然后按以下列顺序创建索引
ALTER table test_table ADD INDEX test_index( status,entry_date);