我可能想多了,但是:
我有一个 API;我想记录对 API 的调用以进行统计/调试。理想情况下,读取速度应该很快,但不是必需的(主要由我读取)。但是,写入速度应该不错,因为我不想减慢 API 的速度。
我们将从头开始,但 API(和日志记录)将持续数年。数据越旧,它的用处就越小。在某些时候,我们可能希望完全删除旧数据(例如,删除超过三年的数据)。
目前正在运行 MySql 5.5。
构建表格的最佳方法是什么?按年对它进行分区,只是弥补未来分区的负载?
PARTITION BY RANGE( YEAR(date) ) (
PARTITION p0 VALUES LESS THAN (2016),
PARTITION p1 VALUES LESS THAN (2017),
PARTITION p2 VALUES LESS THAN (2018),
PARTITION p3 VALUES LESS THAN (2019),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
Run Code Online (Sandbox Code Playgroud)
或者有没有办法创建自动滚动分区?
还是我只是按年份编制索引?
简单查询:
select sum(score) total,name,gender,dob,country
from users join scores on users.id = scores.user_id
where date between '2012-01-01' and '2012-01-31 23:59:59'
group by scores.user_id having sum(score)>=1000 order by sum(score) desc limit 50
Run Code Online (Sandbox Code Playgroud)
因此,尝试获取 2012 年 1 月的累积分数列表,按分数降序排列它们并对其进行分页。
无限制:缓慢但可以:搜索 69348 行。(很高兴弄清楚如何避免临时表,但我不能)。解释说:
1, 'SIMPLE', 'scores', 'range', 'user,date,user+date', 'date', '8', '', 69348, 'Using where; Using temporary; Using filesort'
1, 'SIMPLE', 'users', 'eq_ref', 'PRIMARY', 'PRIMARY', '8', 'scores.user_id', 1, 'Using where'
Run Code Online (Sandbox Code Playgroud)
有限制:它是一样的,但行搜索现在是 1806794,它需要永远。
如果有任何区别,它是一个分区的 InnoDB,所有数据都在一个分区上。