一个MySQL大表还是很多(性能)

时间:2016-01-10 08:54:46

标签: mysql database performance

我的CMS在数据库中有 50表

我正在开发一个项目,为每个用户提供整个CMS 的副本。

我有2个解决方案:

  • 解决方案1:

在我的所有表格中添加名为site_id的列,例如users table

╔════╦═════════╦══════════╦══════════╗
║ id ║ site_id ║ username ║ password ║
╠════╬═════════╬══════════╬══════════╣
║  1 ║      20 ║ phoenix  ║ 12345    ║
║  2 ║      32 ║ sky      ║ qwert    ║
║  3 ║      44 ║ knight   ║ !@#$%^   ║
╚════╩═════════╩══════════╩══════════╝
  • 解决方案2:

为每个用户创建一个单独的表格,例如users_20 table

╔════╦══════════╦══════════╗
║ id ║ username ║ password ║
╠════╬══════════╬══════════╣
║  1 ║ phoenix  ║ 12345    ║
╚════╩══════════╩══════════╝

我想知道哪种解决方案更快更有效?

我希望对我的表格执行不同的工作,例如SelectJOINSUM,...

3 个答案:

答案 0 :(得分:3)

第一个选项对我来说听起来好多了。这些是我的论点:

  • 在每个用户的不同实例中,您可以使用相同的sql 查询,只需要更改site_id
  • 报告:如果你愿意的话 报告任何用户交叉功能,如果你这将是一场噩梦 为每个用户提供单独的表
  • 维护:如果你有任何新的 以后的版本,您需要将DB更改应用于所有 不同的用户实例(也是噩梦)

你可以争辩说,如果你有所有用户的表,你不需要按site_id过滤,所以看起来性能更好,但是当你在所有表中的site_id上​​有索引时,你不应该有任何问题。至少我的服用。

答案 1 :(得分:1)

如果您可以使用动态方式处理数据库表,例如将每个网站与您的用户表链接,并在创建网站时创建一个表,其中包含与您的网站名称相同的引用。这样会更快,因为在这种情况下,您将在多个表格中划分所有行,这对于运行选择查询时的性能最佳,如果您不需要将用户网站与任何其他网站进行比较 - 例如,如果您有2个用户具有相同的用户名,则没有问题。

但是如果你必须检查用户是否在任何用户表中退出并且根本不应该重复,那么在这种情况下,我更喜欢将所有用户放在同一个表中,因为你将检查所有用户中的用户表现较差。

你也应该考虑,当用户登录时,哪些表会检查 - 你是否知道网站表,或者你必须在所有表中检查用户,如果你可以到达用户表,那么最好使用多表,如果没有你应该使用1个表等等。

最后,您的要求将指导您寻找合适的解决方案。

答案 2 :(得分:-1)

在我看来,从性能的角度来看,解决方案2看起来更好。

使用解决方案一,您将拥有包含更多行的表,因此请求的性能将会降低。 Mysql必须在执行读取请求时查找更多行,或在插入新记录时更新更大的索引。

此外,第一个解决方案将意味着修改某些表的主键和/或单一性约束的定义,以允许具有相同名称的多个项目。

修改

你应该回答的第一个问题是,你真的会遇到性能问题吗?这取决于您的CMS用户数量。你可以做一个快速的基准测试,看你的CMS是否很慢,表中包含你想象的用户和艺术品数量的假数据。然后,它会帮助您考虑哪个解决方案更好,考虑到每个解决方案的优缺点。