我有一个具有以下结构的表
CREATE TABLE rel_score (
user_id bigint(20) NOT NULL DEFAULT '0',
score_date date NOT NULL,
rel_score decimal(4,2) DEFAULT NULL,
doc_count int(8) NOT NULL
total_doc_count int(8) NOT NULL
PRIMARY KEY (user_id,score_date),
KEY SCORE_DT_IDX (score_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1
该表将存储自 2000 年 1 月 1 日至今每天应用程序中每个用户的 rel_score 值。我估计总记录数将超过 7 亿。我用 6 个月的数据(约 3000 万行)填充了该表,查询响应时间约为 8 分钟。这是我的查询,
select
user_id, max(rel_score) as max_rel_score
from
rel_score
where score_date between '2012-01-01' and '2012-06-30'
group by user_id
order by max_rel_score desc;
我尝试使用以下技术优化查询,
- 在 score_date 列上进行分区
- 在 score_date 列上添加索引
查询响应时间略微提高到略低于 8 分钟。
如何提高响应时间?桌子的设计合适吗?
此外,我无法将旧数据移动到存档,因为允许用户查询整个数据范围。