【发布时间】:2020-01-11 16:22:41
【问题描述】:
我在 MySQL 中有一个 InnoDB 表,我必须在其中选择和汇总日期范围内的大量数据。似乎我无法达到它对用例运行得足够快的程度。
表格如下:
user_id: 整数
日期:日期
金额:整数
该表有几亿行。
一个日期范围最多可以返回 1000 万行。
金额为1-10
我在所有三列上都有一个复合索引,顺序为:user_id、日期、金额。
我用于选择的查询是:
SELECT
SUM(amount)
FROM table
WHERE user_id = ?
AND request_date <= ?
AND request_date >= ?
我将日期硬编码到查询中。
我还能做些什么来加快这个查询的速度?我应该能够每秒执行大约 20 次查询。
它在 DI 上运行,具有 8gb RAM 和 4 个 CPU(非专用)。
更新
EXPLAIN 的输出是:
select_type: SIMPLE
type: range
possible_keys: composite
key: composite
key_len: 7
ref: null
rows: 14994440
Extra: Using where; Using index
【问题讨论】:
-
能否请您发布 EXAPLIN 的输出? (在上面的查询前面加上 EXPLAIN 这个词)
-
添加了 EXPLAIN 输出的更新
-
对表进行分区。您搜索的日期范围是否跨越数年、数十年?什么?如果需要,您可以按用户和年份进行分区。这样一来,数亿行就少得多了。
-
范围为 30 天。但是从当前日期开始运行 30 天。所以我无法划分特定月份。在 30 个周期内,每个用户仍然可以有多达 1000 万行,乘以几百个用户。
-
@xQbert - 他仍然必须触摸该用户在该日期范围内的所有行。所以分区没有好处。
标签: mysql database database-design innodb