如何使用 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 是可选的 -- 它可以包含 排除在 DATEDATETIME 之外。我更喜欢

    cdate >= '2017-01-01'
AND cdate  < '2017-01-01' + INTERVAL 1 YEAR

避免闰年、午夜、日期算术等