这个问题听起来有点一般。仍然。 我们有一个包含数亿条记录的表。 为了制作报告,将其他几个较小的表与之合并。 为所有适当的列创建索引。 客户希望获得一份一年以上的报告,该报告最多可以包含1亿行。
为了保护过程,例如说脚本死了,或者到数据库的连接断开了,必须将报告分块提取,以便下一个过程在前一个死亡的地方提取报告。
问题在于报告可以按varchar / int列排序,该列可以包含客户名称,帐号,不同格式的各种个人数据等,而我还没有弄清如何获得合理数量的在这种情况下,每个块的行数(例如〜50k)。
使用限制x,y将花费太长的时间来处理此数据量。 没有存档的表,没有分区,数据没有聚合到单独的表中。一个表中只有大量数据。
有没有一种成熟的方法可以解决这类问题?
答案 0 :(得分:1)
“是否存在解决这种问题的既定方法(魔术?)?” -您正在询问我花了很多时间完善的几件事。
“亿万条记录...报告”和“报告可以按不同列进行排序”-使用摘要表,运行速度可以更快:http://mysql.rjweb.org/doc.php/summarytables。汇总表有助于进行排序。
“为所有适当的列创建了索引” –对不起,我很愤世嫉俗,但是我发现该短语表示您有一堆单列INDEXes
,但还没有了解到合适的“复合”索引。 http://mysql.rjweb.org/doc.php/index_cookbook_mysql和http://mysql.rjweb.org/doc.php/index1
“使用LIMIT和OFFSET”-这是效率非常低的原因:http://mysql.rjweb.org/doc.php/pagination。我认为OFFSET
并不需要解决您的问题。 “记住您离开的地方”可能有助于分块以初始构建汇总表。
“到DB的连接断开”-上面的技巧应使其速度足够快以避免此问题。如果没有,请提供SHOW CREATE TABLE
,SELECT
以及其他详细信息。
“分块”-以下是有关分块的提示,但我认为这不是解决当前问题的方法:http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks
“在一个表中有数亿条记录……”-没问题。我的提示针对的是这种大小。
“无分区”-很好。我不必花时间说服您分区不太可能帮助您:http://mysql.rjweb.org/doc.php/partitionmaint
您赢了奖。我认为我从未指向6个博客来回答一个问题。