【问题标题】:Should I break a larger mysql table into multiple?我应该将一个更大的mysql表分成多个吗?
【发布时间】:2010-12-29 12:39:46
【问题描述】:

我有一个相当大的社交网络类型网站,我已经工作了大约 2 年(高流量和 100 个文件)在过去的几年里我一直在尝试调整一些东西以获得最大的流量性能,我了解到很多。现在我有一项艰巨的任务,我计划完全重新编码我的社交网络,因此我正在重新设计 mysql DB 和所有内容。

下面是一张由我有疑问的几个 mysql 表组成的照片。我目前有登录过程中使用的登录表,一旦用户登录到该站点,他们很少需要再次点击该表,除非编辑电子邮件或密码。然后我有一个用户表,它基本上是站点的用户设置和配置文件数据。这是我有疑问的地方,将用户表拆分为较小的表是否会更好?例如,如果您查看用户表,您会看到我标记为“setting_”的几个字段,我应该只创建一个单独的设置表吗?我也有标有“计数”的字段,可能是 cmets、照片、朋友、邮件消息等的总数。所以我应该创建另一个表来存储事物的总数吗?

我现在将它们全部放在 1 个表上的原因是因为我在想如果我可以减少 mysql 查询可能会更好,而不是点击 3 个表来获取我可以点击 1 的每个页面加载的信息。

对不起,如果这令人困惑,并感谢任何提示。

alt text http://img2.pict.com/b0/57/63/2281110/0/800/dbtable.jpg

【问题讨论】:

  • 你有一个相当大的什么
  • 我认为您的意思是将这个问题标记为“模式”,而不是“模式”。
  • 我看到了一些括号',不是吗?

标签: php mysql schema


【解决方案1】:

只要您不SELECT * FROM 您的表,拥有 2 或 100 个字段就不会影响性能。 只需SELECT只有您将要使用的字段,您就可以使用当前的结构。

【讨论】:

  • 我明白这一点,对不起,在这种情况下我不太清楚我的意思是用户表中有多少列
  • 没关系,我的意思是表中的列数不会影响性能。无论如何,在大多数 DB 引擎上......你在使用 InnoDB 吗?
  • 实际上我相信当前用户表不是 InnoDB,但我可能会将这个新表作为 InnoDB 用于行锁定与表锁定
【解决方案2】:

我应该创建一个单独的设置表吗?

那么我应该创建另一个表来存储事物的总数吗?

对此没有一个正确的答案,这取决于您的应用程序的运行情况。

您可以做的是在开发环境中测量和推断结果。

一方面,使用单独的表格会节省一些空间,并且代码会更容易修改。

另一方面,由于必须连接来自不同表的信息,您可能会损失一些性能(并且您已经认为)。

关于计数,我认为有它就可以了,虽然人们总是说这种东西最好计算,但我认为这种情况对你没有任何伤害。

但同样,了解您和您的特定应用的优势的唯一方法是衡量、分析并找出这样做的好处。可能您只会获得 2% 的改进。

【讨论】:

    【解决方案3】:

    您需要比较以下性能测试结果:

    1. 别管它
    2. 将其分成两个表
    3. 使用不同的查询来检索登录数据和配置文件数据(如果您还没有这样做)以及同一个表中的所有数据

    此外,如果使用数据表明这是有利的,您可以对配置文件数据实施某种缓存策略。

    【讨论】:

    • 所有优点,过去 2 年我在同一个站点上进行了可能数百小时的测试,我很快就完成了,但现在我正在重新编码所有内容,这是一个绝佳的机会重新排列任何数据库表。更难的部分是测试并将其分解并测试它,因为老实说差异不会那么大,但是当您有大量流量和数百万条 mysql 记录时,它可能会改变。感谢您的提示
    • 绝对。如果您发布测试结果可能会有所帮助,因为这才是真正重要的。
    【解决方案4】:

    您应该考虑将 counter-列和经常更新的时间戳放在自己的表中 --- 每次碰撞它们时都会写入整行。

    【讨论】:

      【解决方案5】:

      我不会认为您的用户表的列数非常多,这只是我的看法。除非您能找到消除冗余的案例,否则我也不会将该表分成多个表。也许您有很多具有相同设置的用户,这将是打破表格的情况。

      【讨论】:

        【解决方案6】:

        应考虑单行的平均大小,以便确定检索是否昂贵。另外,应该尝试在查找数据时使用索引... 最重要的是设计得当,而不是仅仅因为“它看起来很大”而分裂。也许 IP 或 IP 可能会转到其他地方...取决于保存在那里的数据。

        此外,由于使用此数据的 socialnetworksite 还处理身份验证和自动化过程(我猜是这样),登录和用户表之间的分离应该提供良好的性能,因为登录数据是“足够短”,而对配置文件的访问只能在成功登录后立即进行一次。只需采取正确的技巧来提高数据库性能即可。

        (记住将表可视化为实体,将它们命名为实体,而不是它们的集合)

        【讨论】:

        • 感谢您的提示,您能否详细说明您的意思(记住将表可视化为实体,将它们命名为实体,而不是它们的集合)?谢谢
        • 对。我的意思是(作为一个旧习惯,有点有用)以单数命名表格,呵呵。没什么大不了的,这只是意味着您有一组行,每行都与...登录、...用户、...位置、...等相关。不过没什么特别的。
        【解决方案7】:

        在决定是否要将单个表拆分为多个表时需要考虑的两件事是:

        1. MySQL 喜欢小而一致的数据集。如果您可以构建表以使其具有固定的行长度,这将有助于提高性能,但可能会占用磁盘空间。据我所知,常见的一件事是获取固定长度的数据并将其放在自己的表中,而可变长度的数据将放在其他地方。

        2. 在大多数情况下,联接的性能不如不联接。如果当前表中的数据通常会同时被全部访问,那么将其拆分可能不值得,因为您将减慢插入速度和潜在的读取速度。但是,如果该表中的某些数据不经常被访问,那么出于性能原因,这将是移出该表的理想选择。

        我找不到在线资源来证实下一个陈述,但我确实记得在 Jay Pipes 的一次 MySQL 性能演讲中,他说一旦你在单个查询中获得超过 8 个连接,MySQL 优化器就会出现问题(MySQL 5.0.*)。我不确定这个幻数有多准确,但无论如何,连接通常比从单个表中查询要花费更长的时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-02
          • 1970-01-01
          • 2011-07-17
          • 1970-01-01
          相关资源
          最近更新 更多