将一个大的mysql表拆分成较小的表 - 是否值得?

8
我需要将约2800万条包含美国会员个人信息的记录导入到MySQL数据库中,并且可以按州进行搜索。我的问题是,将表分成较小的表是否比保留在一个大表中更有效?我想把它们分成50个不同的表,代表50个州,例如:members_CA、members_AZ、members_TX等等;这样我就可以进行以下查询:
'SELECT * FROM members_' . $_POST['state'] . ' WHERE members_name LIKE "John Doe" ';

这样我只需要一次处理一个给定州的数据。直观上讲,这很有意义,但我很想听听其他人的意见。

提前感谢。


1
那么,如果你要在所有州中搜索用户名,你会使用50个连接吗? - Jacob
8
你永远不会想做你所描述的那件事。将它保留在一个表格中,永远不要将它分成50个表格。有一种叫做分区的东西,MySQL允许你根据某些规则对表进行分区。研究一下它并从那里开始,如果某个属性有所不同,绝对不能考虑创建单独的表格。这是可怕的数据库设计,难以维护,更别提使用了。 - Michael J.V.
4个回答

16

我最初是以评论的形式发布的,但我现在会发布为答案。

永远不要根据属性之间的差异创建X个表。这不是正确的做法。

如果您的表将有2800万行,请考虑分区以将其拆分为更小的逻辑集合。

您可以在MySQL文档中了解有关分区的信息。

另一件事是选择正确的数据库设计并正确选择索引。

第三件事是避免直接在查询中使用$ _POST的可怕想法,因为您可能不希望有人注入SQL并删除您的数据库、表或其他内容。

最后一件事是选择适当的硬件来完成任务,您不希望这样的应用程序在只有500 MB或1 GB RAM的VPS上运行。


2
不要这样做。将相似的数据保留在一个表中。当决策涉及到多个状态时,实现逻辑决策和查询制作将会带来大量问题。此外,如果需要更改数据库定义(例如添加列),则必须对所有众多(看似无限)的表执行相同的操作。
使用索引来提高性能,但仍要坚持单表格!!!
您也可以增加内存缓存以提高性能。请参考本文进行操作。

1
如果您在“state”列上创建索引,则对一个州的所有成员进行选择与使用单独的表一样有效。拆分表有很多缺点。如果您添加列,则必须在50个表中添加它们。如果您想要来自不同州的数据,则必须使用联合语句,这将非常丑陋和低效。我强烈建议坚持使用一个表。

0

我的第一反应是您需要将所有类似的数据放在一起,并将其作为一个表。您应该考虑在表上放置索引以提高性能,但不要将其分成较小的表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接