我们有一个表作为要处理的项目队列。此表有一个状态列,可以包含0或1,以指示记录是否仍处于活动状态。该表目前有大约4MM行,并且会快速增长。
行的分布约为5%,status = 0,95%,status = 1.典型查询仅查找status = 0的记录。
随着表的增长,查询开始变慢。这是因为MySQL优化器没有在状态列上使用索引,因为它的基数太低了。
我们正在考虑通过状态列将表分区为2个分区。我们的想法是我们可以使用分区修剪,因此通常只需要分析总记录的5%。我们保留status = 1记录只是出于档案原因。
我的问题是这种方法是否会产生我想要的预期效果,还是负面效果会超过效益?更新行从status = 0到status = 1会导致性能问题吗?
答案 0 :(得分:1)
如果需要考虑更新状态列的性能,那么只需创建一个单独的表来存储已存档的记录,然后在服务器的每个特定时间段内安排将存档记录从原始表移动到此存档表安静的时光?
这种方式在第一次迁移后,您最终会得到更小的“活动”表,并且最终用户无法实现将状态从“0”更改为“1”的I / O缓慢。