mysql - 将表与一对一关系组合起来

标签 mysql sql database performance

我有四个表,其中存储了有关某事物的大量信息。这些信息可以分为四类。一类信息总是被查询,而其他三类信息则偶尔被查询。

由于所有这些表之间存在一对一的关系,因此它们可以存储在一个表中。

我的问题是:什么是更好的性能?

  • 一张包含 SELECT id, x, y, z FROM allSELECT id, u, v FROM all 等查询的表

  • 包含 SELECT * FROM xyzSELECT * FROM uv 等查询的多个表

(其中 iduvxyz 是列, all 是包含所有列和 xyz 的表uv是具有相应列的表格)

最佳答案

这确实取决于。

理论上,关系数据库是为了在表之间建立有效的关系。因此,如果 a.x 和 b.x 相同,SELECT a.x, a.y, a.z FROM a 应该与 SELECT a.x, a.y, b.z from a JOIN b ON a.x = b.x 一样快主键(eq_ref 连接)。

示例:

  • 由于记录在磁盘上的物理位置,从一个大表中选择多个连续行比从两个小表中选择多个连续行稍快。

  • 除非不同的表位于不同的硬盘上,在这种情况下MySQL可以并行地获取它们。

  • 但这也可以使用 PARTITIONING 通过一张表来完成。

  • 如果某些查询比其他查询运行得更频繁,您可能需要首先针对这些查询进行优化。也许覆盖索引可以解决您的问题?

  • 使用多个表也会重复主键。但话又说回来,InnoDB 上的索引也是如此。

  • 对于多个表,维护完整性变得更加困难。您将使用外键和事务来进行插入(甚至触发器?)

结论:

这实际上取决于您的情况。找出答案的最佳方法是测试和基准测试。

关于mysql - 将表与一对一关系组合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700021/

相关文章:

database - Moodle 2.0 在哪里存储文件?在数据库中还是在文件系统中?

MySQL 可选存储过程参数

php - 是否可以添加一个链接,在单击时会登录用户?

php - mysql 基于另一列的 AUTO_INCRMENT

sql - 在什么规模的数据下分区的 ROI 最有值(value)?

php - 如果WordPress中的meta_key=x AND meta_value=y,我该如何显示图像?

sql - 我怎样才能编写一个程序来获得级别 i 到 j 或像这样的树?

sql - 如何从多个表中删除数据?

mysql - 如何找到活跃用户列表 Laravel MySQL?

php - 在 PHP 中更新图像类别时出错