在MySQL中构建一个大表

时间:2009-08-11 05:43:30

标签: mysql database-design

这是我第一次使用包含1000万条记录的表构建数据库。该表是一个成员表,其中包含成员的所有详细信息。

构建数据库时需要注意什么?

我需要特殊版本的MySQL吗?我应该使用MyISAM还是InnoDB?

3 个答案:

答案 0 :(得分:4)

首先,您可能需要退后一步并重新检查您的架构。你是如何在成员表中获得1000万行的?你真的有1000万会员(似乎很多)?

我怀疑(虽然我不确定)您的成员少于1000万,在这种情况下,您的表格将无法正确构建。请发布架构,这是我们帮助您的第一步。

如果你有1000万会员,我的建议是让你的应用程序与供应商无关(即标准SQL)。然后,如果你开始遇到问题,只需抛弃当前的DBMS并用更强大的DBMS替换它。

一旦你建立了一个合适的,那么然后只有我会建议使用特定于供应商的东西。否则,改变将是一个痛苦的过程。

BTW,1000万行并不是真正的大数据库表,至少不是我来自的地方。

除此之外,以下内容很重要(不一定是详尽的清单,但是一个良好的开端)。

  • 始终为3NF设计表格。一旦发现性能问题,只要您了解后果,就可以违反该规则。
  • 在开发过程中不要打扰性能调整,您的查询处于不稳定状态。只要接受他们可能无法快速运转的事实。
  • 大部分查询被锁定后,然后开始调整您的表格。添加任何索引可加快选择速度,取消规范化等等。
  • 调整是而不是一个“一劳永逸”的操作(这就是我们为DBA付出这么多钱的原因)。持续监控性能并调整以适应。
  • 我更喜欢保持我的SQL标准,以保留随时切换供应商的能力。但我很务实。使用特定于供应商的东西,如果它真的给你一个提升。只要知道你正在失去什么,并尽可能地隔离特定于供应商的东西。
  • 当他们不需要每列时使用"select * from ..."的人应该被提交。
  • 同样选择在客户端过滤掉每一行的那些。编写我们的DBMS的人并不是整天都在玩Solitaire,他们知道如何让查询快速运行。让数据库做最好的事情。过滤和聚合最好在服务器端完成 - 只发送线路上所需的内容。
  • 生成查询以发挥作用。除了要求报告详细说明其航空母舰的每个部件都达到螺栓螺栓水平的国防部之外,没有人有兴趣阅读你的1200页报告,无论你认为它有多么有用。事实上,我不认为美国国防部也会读他们的,但是我不想让一些将军咀嚼我,因为我没有提供 - 那些家伙可以大声他们有一点点他们控制着的尖端武器。

答案 1 :(得分:0)

至少使用InnoDB。当你意识到MyISAM刚丢失你的数据时,你会感到痛苦......

除此之外,你应该提供更多关于你想做什么的信息。

答案 2 :(得分:0)

如果您没有数据完整性和原子操作要求,则无需使用InnoDB。如果表之间有外键,并且需要保留约束,或者需要在原子操作中更新多个表,则需要使用InnoDB。否则,如果您只需要使用该表进行分析,MyISAM就可以了。

对于查询,请确保构建智能索引以适应查询。例如,如果要按列c排序并根据列a和b进行选择,请确保您的索引按顺序包含列a,b和c,并且该索引包含每列的完整长度而不是前缀。如果您没有正确执行索引,那么对大量数据进行排序将会导致您死亡。见http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

关于InnoDB的一个注释,并设置和测试一个大表。如果您开始注入数据,则需要数小时。确保定期发出提交,否则如果你想因任何原因停止和重做,你最终必须等待数小时进行事务恢复,或者2)杀死mysqld,将InnoDB recover标志设置为no recover并重新启动。此外,如果你想从头开始重新注入数据,DROP表并重新创建它几乎是瞬间的,但实际上“删除表”需要几个小时。