我目前正在处理一个超过 1200 万行的表(使用 导出时大约 3 GB mysqldump
)并且很好奇一个表实际上可以得到多大而不会对性能产生任何严重影响。该表每天大约增长 100,000-200,000 行。
在数据变得更大之前,我现在是否应该开始考虑将这些数据跨多个表或 mysql 实例进行分片?目前运行它的服务器有 1 GB 的内存(尽管它很快就会转移到 3/4 GB 的机器上)。
有没有人有任何提示/推荐阅读可以将我推向正确的方向,或者这是我还不需要担心的事情?
谢谢 :)
我目前正在处理一个超过 1200 万行的表(使用 导出时大约 3 GB mysqldump
)并且很好奇一个表实际上可以得到多大而不会对性能产生任何严重影响。该表每天大约增长 100,000-200,000 行。
在数据变得更大之前,我现在是否应该开始考虑将这些数据跨多个表或 mysql 实例进行分片?目前运行它的服务器有 1 GB 的内存(尽管它很快就会转移到 3/4 GB 的机器上)。
有没有人有任何提示/推荐阅读可以将我推向正确的方向,或者这是我还不需要担心的事情?
谢谢 :)
一个好的 RDBMS 可以增长以容纳极大的数据。3Gb 数据库非常易于管理,而且很有可能,只要您可以获得具有足够 RAM 的服务器,大多数查询将运行得非常快而毫不费力。
即使当您超出 RAM、索引、缓存和分区时,您仍然可以表现出色。通常,应用程序访问大多数相对较小的工作集——例如,90% 的查询可能仅限于上个月的数据——而 10% 可能是对较旧数据的查询。“上个月”的数据趋于稳定——当你有更多的用户时它会增长,但除此之外,它不会随着时间的推移而增长。这个“工作集”通常适合 RAM,被缓存并且您仍然可以获得出色的性能。
但是随后,您可能会再次变慢。通过适当的监控和分析,您可以找到运行缓慢的查询并采取措施解决它们。
这通常很简单:
EXPLAIN
是你的朋友。通常,创建查询可以使用的索引就足够了(粗略地说,您需要在出现在WHERE
子句中的列上建立索引)。此外,有时调整查询本身会产生好的结果另一种产生良好效果的方法是使用硬件解决问题:
在其他一些情况下,复制和分片可能是个问题。复制很复杂,但诸如 Oracle RAC 之类的东西可以让你构建怪物集群(有代价)。分片是另一种选择,但它通常是实施起来最复杂的选择之一——即使是很容易分片的应用程序也需要大量工作才能分片,而且一些应用程序可能非常难以分片。
我认为您的数据库访问磁盘的那一刻 - 您的性能会下降,因此您需要确保您的机器具有比数据库大小更多的 RAM。适合您的解决方案是分区或分片(对于分片,请查看http://www.scalebase.com - 他们进行透明分片,因此毫不费力)