用于最快查找的最佳MySQL表结构

时间:2011-05-19 03:03:41

标签: php mysql query-optimization

对于100%阅读(无写作)的表格,哪种结构更好,为什么?

[我的表有很多列,但为了简单起见,我在这里做了一个带有4列的例子]

选项1:一个包含多列的表

ID | Length   | Width    | Height
-----------------------------------------
1  | 10       | 20       | 30
2  | 100      | 200      | 300

选项2:两张桌子;一个存储列标题和其他存储值

表1:

ID | Object_ID | Attribute_ID | Attribute_Value
------------------------------------------
1  | 1         | 1            | 10
2  | 1         | 2            | 20
3  | 1         | 3            | 30
4  | 2         | 1            | 100
5  | 2         | 2            | 200
6  | 2         | 3            | 300

表2:

ID | Name
-------------------
1  | Length
2  | Width
3  | Height

2 个答案:

答案 0 :(得分:4)

您的第二个选择是EAV反模式的实施不足:

Entity-Attribute-Value Model

为什么它的坏处已经在这个网站和其他地方被认为是死亡。

你会从第一个得到更好的结果。

答案 1 :(得分:0)

我将在前言中说我是SQL和数据库表的相对新手;然而,这并不意味着我不了解我的基本知识。

除非您的示例过于简单,否则您应该使用第一个示例。它不仅更快更容易查询,而且更有意义。

在此示例中,您根本不需要拆分表格;表格标题充分表示了您的“属性ID”。此外,这些值本身没有实际意义,因此它们实际上不需要在另一个表中。

如果你有另一个与你的对象有关系的另一个对象,你通常可以打破一个新的表并引用它。

以下是使用博客条目和博客条目评论的示例(实际上来自我在O'Reilly服务器上的数据库):

mysql> select * from blog_entries;
+----+--------------+-------------+---------------------+
| id | poster       | post        | timestamp           |
+----+--------------+-------------+---------------------+
|  1 | lunchmeat317 | blah blah   | 0000-00-00 00:00:00 |
|  2 | Yongho Shin  | yadda yadda | 0000-00-00 00:00:00 |
+----+--------------+-------------+---------------------+
2 rows in set (0.00 sec)

mysql> select id, blog_id, poster, post, timestamp from blog_comments;
+----+---------+--------------+----------------+---------------------+
| id | blog_id | poster       | post           | timestamp           |
+----+---------+--------------+----------------+---------------------+
|  1 |       1 | lunchmeat317 | humina humina  | 0000-00-00 00:00:00 |
|  2 |       1 | Joe Blow     | huh?           | 0000-00-00 00:00:00 |
|  3 |       2 | lunchmeat317 | yakk yakk yakk | 0000-00-00 00:00:00 |
|  4 |       2 | Yongho Shin  | lol            | 0000-00-00 00:00:00 |
+----+---------+--------------+----------------+---------------------+
4 rows in set (0.00 sec)

mysql>

从逻辑的角度考虑它;当它不需要存在时,没有理由人为地将复杂性注入到这个设计中。在您的示例中,长度,宽度和高度不是真正独立的对象,它们都与您在表格行中描述的对象的尺寸相关。此外,长度宽度和高度在给定时间只有一个值。

我希望这有点道理 - 如果我在教学方面有点迂腐,我道歉。但是,如果其他人偶然发现了这个问题,希望这个例子可以帮助他们。

祝你好运。

编辑:我刚刚意识到你的问题是关于性能的。这有点深入,可能基于您使用的数据库引擎?但是,一般来说,我认为在不进行任何连接的情况下查询表会稍快一些,因为非规范化是一种常用的提高性能的方法。