如何使用 1.6M 行生成更快的 mysql 查询
How to generate faster mysql query with 1.6M rows
我有一个有 160 万行的 table。每当我使用下面的查询时,平均需要 7.5 秒。
select * from table
where pid = 170
and cdate between '2017-01-01 0:00:00' and '2017-12-31 23:59:59';
我尝试添加 LIMIT 1000 或 10000 或更改日期以过滤 1 个月,它仍然处理它到平均 7.5 秒。我尝试为 pid 和 cdate 添加一个复合索引,但结果慢了 1 秒。
这是索引列表
https://gist.github.com/primerg/3e2470fcd9b21a748af84746554309bc
我还能让它更快吗?考虑到数据量,这是acceptable性能吗?
似乎缺少索引。创建此索引,看看它是否对您有所帮助。
CREATE INDEX cid_date_index ON table_name (pid, cdate);
并将您的查询修改为以下内容。
select * from table
where pid = 170
and cdate between CAST('2017-01-01 0:00:00' AS DATETIME) and CAST('2017-12-31 23:59:59' AS DATETIME);
- 请提供
SHOW CREATE TABLE clicks
.
- 返回了多少行?如果是 100K 行,铲除那么多行的工作量很大。你会用那么多行做什么?如果您随后对它们进行总结,请考虑在 SQL!
中进行总结
- 确实有
cdate
作为 DATETIME
。
你用 id
做什么?也许这样会更好:
PRIMARY KEY (pid, cdate, id) -- to get benefit from clustering
INDEX(id) -- if still needed (and to keep AUTO_INCREMENT happy)
这有点像数据仓库。 DW 从构建和维护摘要 table(s) 中获益匪浅,例如具有每日点击次数(等)的摘要,您可以从中 非常 快速总结 365 次计数得到答案。
CAST
是不必要的。此外,0:00:00
是可选的 -- 它可以包含 或 排除在 DATE
或 DATETIME
之外。我更喜欢
cdate >= '2017-01-01'
AND cdate < '2017-01-01' + INTERVAL 1 YEAR
避免闰年、午夜、日期算术等
我有一个有 160 万行的 table。每当我使用下面的查询时,平均需要 7.5 秒。
select * from table
where pid = 170
and cdate between '2017-01-01 0:00:00' and '2017-12-31 23:59:59';
我尝试添加 LIMIT 1000 或 10000 或更改日期以过滤 1 个月,它仍然处理它到平均 7.5 秒。我尝试为 pid 和 cdate 添加一个复合索引,但结果慢了 1 秒。
这是索引列表 https://gist.github.com/primerg/3e2470fcd9b21a748af84746554309bc
我还能让它更快吗?考虑到数据量,这是acceptable性能吗?
似乎缺少索引。创建此索引,看看它是否对您有所帮助。
CREATE INDEX cid_date_index ON table_name (pid, cdate);
并将您的查询修改为以下内容。
select * from table
where pid = 170
and cdate between CAST('2017-01-01 0:00:00' AS DATETIME) and CAST('2017-12-31 23:59:59' AS DATETIME);
- 请提供
SHOW CREATE TABLE clicks
. - 返回了多少行?如果是 100K 行,铲除那么多行的工作量很大。你会用那么多行做什么?如果您随后对它们进行总结,请考虑在 SQL! 中进行总结
- 确实有
cdate
作为DATETIME
。
你用 id
做什么?也许这样会更好:
PRIMARY KEY (pid, cdate, id) -- to get benefit from clustering
INDEX(id) -- if still needed (and to keep AUTO_INCREMENT happy)
这有点像数据仓库。 DW 从构建和维护摘要 table(s) 中获益匪浅,例如具有每日点击次数(等)的摘要,您可以从中 非常 快速总结 365 次计数得到答案。
CAST
是不必要的。此外,0:00:00
是可选的 -- 它可以包含 或 排除在 DATE
或 DATETIME
之外。我更喜欢
cdate >= '2017-01-01'
AND cdate < '2017-01-01' + INTERVAL 1 YEAR
避免闰年、午夜、日期算术等