【问题标题】:MySQL Performance - Number of Tables Vs. Number of RowsMySQL 性能 - 表数与。行数
【发布时间】:2012-04-01 14:37:33
【问题描述】:

我有两条路线,

1) 为每个用户创建子表并存储他的个人内容

2) 创建少量表并将所有用户的数据存储在其中。

例如。

1) 100,000 个表,每个表有 1000 行

2) 50 个表,每个表有 2,000,000 行

我想知道哪条路线最好、最高效。

上下文:就像 Facebook,对于数百万用户而言,他们的帖子、照片、标签。所有这些信息都在所有用户的一些巨型表中,或者每个用户都有自己的子表。

【问题讨论】:

标签: php mysql mysql-management


【解决方案1】:

这是 MySQL 中这两种方法的一些优缺点。

1.许多小桌子。

缺点

  • 使用更多并发表意味着需要更多文件描述符(检查this
  • 包含 100.000 个表的数据库是一团糟。

优点

  • 小表意味着小索引。小型索引可以完全加载到内存中,这意味着您的查询会运行得更快。
  • 此外,由于索引较小,插入等数据操作会运行得更快。

2。几张大桌子

缺点

  • 一个巨大的表意味着非常大的索引。如果您的索引无法完全加载到内存中,大多数查询将非常缓慢。

优点

  • 数据库(以及您的代码)清晰且易于维护。
  • 如果您的表变得如此之大,您可以使用分区。 (检查this)。

根据我的经验,一个有 200 万行的表(我曾经使用过 7000 万行的表)如果您能够将所有活动索引加载到内存中,那么在 MySQL 下这不是性能问题。

如果您有很多并发用户,我建议您评估其他技术,例如 Elastic Search,它们似乎更适合这种情况。

【讨论】:

    【解决方案2】:

    为每个用户创建一个表是最糟糕的设计。这是你在 db 设计课上学到的第一件事。

    【讨论】:

      【解决方案3】:

      表是数据库的一个强大的逻辑组件,因此它被 RDBMS 用于许多维护任务。例如。习惯上设置表文件空间、限制、配额、日志空间、事务空间、索引树空间和许多其他东西。如果每个表都有自己的文件来放入数据,那么在加入表或其他任何事情时,您将获得大量的往返时间。

      当您创建许多表时,您的维护开销会非常大。此外,您将否认关系来源的本质。并且只是假设您正在向数据库添加记录 - 每次都创建一个新表?你的代码会有点困难。

      不过话说回来,你可以自己试试看。

      【讨论】:

      • @DmitriyReznik 如果我的查询中没有连接,是否可以有很多表,例如 100k
      【解决方案4】:

      您应该利用 MySQL indexes 的强大功能,它基本上提供类似于每个用户拥有一个表的功能。

      创建一个以 user_id 为索引的名为 user_data 的表将(总体上)转换在 上具有 where 子句的查询user_id 喜欢这个:

      SELECT picture FROM user_data WHERE user_id = INT
      

      进入:

      • 在索引中查找 user_data 其中 user_id = INT
      • 的行
      • 然后,在这批行中加载我 picture 的值

      通过这样做,MySQL 不会搜索 user_data 中的所有行,而是搜索索引中找到的相关行。

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 2012-01-04
        • 2017-04-09
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多