Mysql性能,一个表或两个


Mysql performance, one table or two

我使用PHP和mysql。

假设我有一个有10,000行的数据库表。下面哪种情况下性能最好?

案例1

两个表,productscategories

SELECT * FROM products INNER JOIN categories ON products.category_id = categories.id
产品

id
name
category_id

id
name

案例2

一个表,products,包含所有的数据。

SELECT * FROM products
产品

id
name
category_name

问题(s)

  • 哪种情况下性能最好?
  • 猜测,需要很长时间才能获得具有10,000行结构的数据吗?
  • 其中一个案例有什么缺陷吗?

从我的角度来看,Case 1是"正确"的方法,但我将通过使用Case 2来节省一些开发时间。也许还包括性能?

第一种是存储该数据的正确(即SQLish)方式。它允许您执行以下操作:

  • 使用标准外键关系,在插入和更新类别名称时验证它们。
  • 更改一个类别名称并使其影响所有产品
  • 包含类别的其他信息,如短名称、长描述、添加日期等。

性能不是主要考虑因素。SQL引擎通过使用奇特的连接算法和索引来提高性能。这样你就可以用最合理和可维护的方式为你的应用程序构建数据。

也就是说,哪个表现更好取决于许多因素(类别名称有多长,有多少不同的名称,产品记录有多宽)。这两种场景之间的性能差异对于使应用程序以最佳方式工作可能根本不重要。

情形1比情形2好,因为如果你实现情形2,你最终会得到双数据。通过双数据,我的意思是您将在"category_name"字段中拥有多次相同的值。这有两个不好的原因,首先是因为它会因为太多不必要的数据(双数据)而降低性能。第二个原因是因为效率。假设你想改变一个类别的名字,比如把饮料改成饮料,在第二种情况下会比第一种情况花费更多的时间。因此,要回答你的第一个问题,情况一是解决方法。

你可以想象,通过阅读我对问题1的回答,情况1比情况2快,因为情况2有不必要的数据。

你的最后一个问题,就像我在第一个问题的答案中解释的那样,情况2的一个陷阱是,你想改变一个类别名称,你最终会比情况1做更多的工作。据我所知,案例1没有缺陷。

我认为这个问题是关于database design的。

现在回答你的问题:

  1. 哪种情况下性能最好?

    答案-案例1。

    为什么?

    • 它遵循Normalization的基本SQL规则,这将有助于您的长期运行。如果将来您有超过10,000行,那么使用redundant data在单个表中处理它将是乏味的。
    • 如果你在key列上执行indexing,它将帮助你在大量行上更快地执行join查询。
    • 两个单独的表将帮助您减少数据redundancy

    为什么不是情况2?

    单表将违反Normalization规则。您的示例显示,对于单个表,它将违反这些规则。

  2. 是否需要很长时间才能获得10,000行这样的结构?

    对于情况1:它将花费比Case 2稍长的时间,因为将涉及join查询。但是这个时间将是negligible,也可以通过使用indexing来减少。

    对于情况2:它将花费比Case 1少一点的时间,但由于redundant data或当记录数量增加时,它的性能可能会不足。

  3. 可能的陷阱?

    With case 1 -

    • 你可能最终会为一些困难的场景编写复杂的join查询。

    With case 2 -

    • 数据冗余/重复
    • 长时间运行低性能
    • 可读性差

希望这对你有帮助。