mysql - 为了获得最佳性能,是将单个数据划分到单独的表中还是保留在单个表中更好

标签 mysql database performance optimization schema

我看到了一些与此相关的问题,但我觉得它们的情况并不完全相同。这也不是一个与规范化相关的问题。

假设我们有一个产品,它具有一些属性,例如名称、描述、价格、last_update_date、stock_amount

假设,这些“产品”永远不会有 2 个不同的价格或库存等,并且我们不必保留历史数据等。

从性能角度来看,将所有这些数据保存在一个表中会更好吗?或者将其分成单独的表?如:

products -> id, name, last_update_date, stock_amount, price

product_info -> id, products_id, description

我知道数据的划分不太符合逻辑,但这不是现在的重点。

我也许能想到两个论点,

  1. 如果将数据分成 2 个表,例如要更新描述,则需要找到 products_id 然后更新数据,这可能会花费更多。另一方面,产品表的存储占用空间会小得多。这是否有助于提高查找产品(例如按名称)时的效率?或者因为我们有一个“名称”索引,所以磁盘上的表有多大并不重要?
  2. 好吧,如果所有内容都在一张表中,我们就不需要在单独的表上工作,这可能会提高效率?

你觉得怎么样?您的观点基于什么?欢迎提供链接和基准测试结果。

谢谢!

最佳答案

如果一切都是一对一的映射,则没有充分的理由不将其全部保存在一个表中。您仍然应该有一个 ID 列,以便如果您有其他一对多或多对多的数据,您可以通过这些表中的 ID 引用产品。

但是,将其拆分为不同的表的好处之一是可以提高并发性。如果所有内容都在一个表中,那么对该表的更新将锁定整行(如果使用 MyISAM,则锁定整个表)。如果将其拆分为多个表,则对其中一个表的更新不会干扰使用其他表的查询。

关于mysql - 为了获得最佳性能,是将单个数据划分到单独的表中还是保留在单个表中更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327152/

相关文章:

performance - Haskell 中具有 rank-2 多态性的令人费解的性能/输出行为

php - 自动完成某一字段

php - 在 MySql 和 Objective C 之间传递数据

database - 一个简单的问题,在多对多关系中,哪个表应该有另一个表的外键

java - Guava Multimaps.filterKeys 与 NavigableMap.subMap() 相比性能较差

SQL、Postgres OID,它们是什么以及它们为什么有用?

mysql - 如何在mysql中同时使用NOT LIKE和JOIN?

php - 如何显示下拉选择的值

php - Symfony2 数据库配置

database - oracle多久修改一次查询计划?