MySQL和一个带有100+;数百万行

MySQL和一个带有100+;数百万行,mysql,Mysql,我有一些超过1亿行的表格。 我每个月大约有2000-4000万行 此时此刻,一切似乎都很好: -所有的插件都很快 -所有选择都很快(它们使用索引,不使用复杂的聚合) 然而,我担心两件事,我在某处读到的: -当一个表有几亿行时,插入速度可能会很慢,因为重新平衡索引(二叉树)可能需要一段时间 -如果索引不适合内存,则可能需要一段时间才能从磁盘的不同部分读取它 如有任何意见,将不胜感激。 如有任何建议,如能避免或解决/缓解问题(如果/何时发生),将不胜感激 (我知道总有一天我们应该开始切分) 提前感谢

我有一些超过1亿行的表格。 我每个月大约有2000-4000万行

此时此刻,一切似乎都很好: -所有的插件都很快 -所有选择都很快(它们使用索引,不使用复杂的聚合)

然而,我担心两件事,我在某处读到的: -当一个表有几亿行时,插入速度可能会很慢,因为重新平衡索引(二叉树)可能需要一段时间 -如果索引不适合内存,则可能需要一段时间才能从磁盘的不同部分读取它

如有任何意见,将不胜感激。 如有任何建议,如能避免或解决/缓解问题(如果/何时发生),将不胜感激

(我知道总有一天我们应该开始切分)


提前感谢您。

今天是您应该考虑切分或分区的日子,因为如果您今天有100万行,并且您以每月约30毫米的速度获得这些行,那么您将在三个月内将其大小增加一倍,并可能在年底前将其再次增加一倍

在某个时刻,您将遇到一个事件范围,您的数据库太大,无法迁移。您的磁盘上没有足够的工作空间来切换到备用架构,或者您没有足够的停机时间来执行迁移,直到迁移需要重新运行。然后你就永远被它困住了,因为它变得越来越慢

表上写入活动的性能在很大程度上取决于索引维护的难度。索引的数据越多,写入的惩罚就越大。指数的类型都是相关的,有些指数比其他指数更紧凑。如果您的数据只是少量索引,您通常可以在事情开始变得极其缓慢之前获得更多记录,但这种降级系数在很大程度上取决于您的系统配置、硬件和IO容量

请记住,您应该使用的引擎InnoDB有很多调优参数,许多人将其设置为非常糟糕的默认值。查看分配给它的内存,并确保您正确地执行了该操作

如果您有任何方法对这些数据进行分区,比如按月份、按客户或其他一些基于业务逻辑不会改变的因素,即数据本质上不相关,那么您将有许多简单的选项。如果不是,你将不得不做出一些艰难的决定

您现在要做的一件事是模拟表中有1G行时的性能。创建足够大、适当变化的测试数据量,然后查看它在负载下的性能。你可能会发现这不是一个问题,在这种情况下,再过几年就不用担心了。如果不是的话,今天就开始惊慌失措,在数据变得太大而无法分割之前,努力寻找解决方案


数据库性能通常会以一种相当线性的方式下降,然后在某个点上会从悬崖上跌落。你需要知道悬崖在哪里,这样你才能知道在你撞上它之前你有多少时间。性能的急剧下降通常发生在索引无法放入内存时,以及磁盘缓冲区太薄而无法使用时。

我如何检查索引是否放入内存?这归结为测试、测试和更多测试。您可以观察到一些变量,它们告诉您MySQL是如何使用内存的,但这是一个漫长而复杂的讨论。关于这一主题有很多书。通常情况下,如果磁盘上的索引文件大小超过InnoDB的可用内存,您肯定会遇到麻烦,但由于其他压力,耗尽通常发生在这一点之前。