将大型mySql表拆分成较小的表 - 值得吗?

时间:2011-07-14 15:47:20

标签: mysql

我有大约2800万条记录要导入mySql数据库。该记录包含有关美国会员的个人信息,可供各州搜索。

我的问题是,将表拆分为更小的表是否更有效率而不是将所有内容保存在一个大表中?我想到的是将它们分成50个单独的表,代表50个州,如:member_CA,members_AZ,members_TX等;

这样我可以这样做一个查询:

'SELECT * FROM members_' . $_POST['state'] . ' WHERE members_name LIKE "John Doe" ';

这样我只需要立即处理给定状态的数据。直觉上它很有意义,但我很想听到其他意见。

提前致谢。

4 个答案:

答案 0 :(得分:16)

我最初发布了评论,但现在我会发布一个答案。

从来没有想过根据属性的差异创建X表。事情并非如此。

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

您可以在MySQL documentation了解有关分区的信息。

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

第三件事是你避免在查询中直接使用$ _POST的可怕想法,因为你可能不希望有人注入SQL并丢弃你的数据库,表或什么不是。

最后一件事是为任务选择合适的硬件,你不希望这样的应用程序在VPS上运行500 mb ram或1 gg ram。

答案 1 :(得分:2)

这样做。将类似数据保存在1个表中。当决策跨越许多州时,您将在实施逻辑决策和查询制作方面遇到严重问题。此外,如果您需要更改数据库定义(如添加列),则必须对所有众多(看似无限的)表执行相同的操作。

使用索引来提高性能,但坚持使用单表!!!

您也可以增加内存缓存,以提高性能。 Follow this article to do so.

答案 2 :(得分:1)

如果在state列上创建索引,则对一个州的所有成员的select将与使用单独的表一样高效。 Splittimg表有很多缺点。如果添加列,则必须将它们添加到50个表中。如果你想要来自不同状态的数据,你必须使用非常丑陋和低效的union语句。我强烈建议坚持一桌。

答案 3 :(得分:0)

我的第一个回答是你需要将所有类似数据放在一起并将其保存为一个表。您应该考虑将索引放在表上以提高性能,但不要将其分解为更小的表。