Mysql性能,一两个表

时间:2016-09-21 11:47:57

标签: php mysql sql performance select

我使用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是&#34;正确的&#34;这样做的方法,但我会使用Case 2来节省一些开发时间。也许表现呢?

3 个答案:

答案 0 :(得分:6)

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

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

表现不是主要考虑因素。 SQL引擎通过使用花哨的连接算法和索引来处理性能。这样做可以让您以最合理和可维护的方式为您的应用程序构建数据。

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

答案 1 :(得分:1)

案例1优于2,因为如果你要实现案例2,你最终会获得双重数据。通过双数据,我的意思是您将在“category_name”字段中多次使用相同的值。这有两个原因,首先是因为太多不必要的数据(双数据)会降低性能。第二个原因是因为效率。假设你想改变一个类别名称,比如饮料,它会在第二种情况下花费更多时间而不是第一种情况。 所以,为了回答你的第一个问题,案例1就是这样做的。

正如您可以想象的那样,通过阅读我对问题1的回答,案例1比案例2更快,因为案例2有不必要的数据。

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

答案 2 :(得分:0)

我认为问题是database design为中心。

现在回答你的问题:

  1. 哪种情况会带来最佳表现?

    回答 - 案例1.

    <强>为什么吗

    • 它遵循SQL的基本Normalization规则,它将帮助您进行更长时间的运行。如果将来您拥有超过10,000行,那么在单个表中处理它将会很繁琐redundant data
    • 如果您对indexingkey join,则可以帮助您在大量行上更快地执行redundancy次查询。
    • 两个单独的表格可帮助您减少数据Normalization

    为什么不是案例2?

    单个表格将违反Case 2规则。您的示例显示,使用单个表格会违反这些规则。

  2. 需要很长时间才能获得具有类似结构的10,000行吗?

    使用案例1 join会花费一些时间,因为会涉及negligible个查询。但这次会是indexing并且也可以使用Case 1来减少。

    使用案例2 redundant data花费更少的时间,但由于join或记录数量可能会导致其性能下降会成长。

  3. 可能陷阱?

    案例1 -

    • 您可能最终会针对某些困难情况编写复杂的public void count1() { int min, max; min = Integer.parseInt(JOptionPane.showInputDialog("lowest number")); max = Integer.parseInt(JOptionPane.showInputDialog("highest number")); String buff = ""; for (int i = min; i <= max; i += 7) { buff += i + " "; } JOptionPane.showMessageDialog(null, buff); } 查询。

    案例2 -

    • 数据冗余/重复
    • 长期运行效果不佳
    • 可读性差
  4. 希望这对你有所帮助。