SELECT继承性能:LEFT OUTER JOIN vs“super-table”TYPE COLUMN

时间:2014-08-02 03:11:30

标签: mysql database join left-join

我有继承的SQL表:

  • 历史(id,date,ip user_id):“超级表”。
  • history_connection (id,user_agent):映射用户的帐户连接。
  • history_email (id,email):地图用户的电子邮件修改。

目标是在我的数据库中登录有关用户的不同类型的历史记录。 history_connection history_email 的“id”列是主键和指向 history 表id的外键。

现在想象一下,在请求中,我不需要访问“子表”列,但我需要知道它是哪种类型的历史记录。我马上考虑LEFT OUTER JOIN:

SELECT h.id,h.date,h.ip,h.user_id,hc.id,he.id
FROM history h
LEFT OUTER JOIN history_connection hc
ON h.id=hc.id
LEFT OUTER JOIN history_email he
ON h.id=he.id

如果hc.id不为null,我可以推断出历史记录的类型:在这种情况下,连接历史记录。问题是我不认为它对性能非常有效,因为如果我在“超类”历史中添加“类型”列,我可以简化这样的查询:

SELECT id,date,ip,user_id,type
FROM history

我的问题是,您是否认为我需要为性能原因添加类型列?

1 个答案:

答案 0 :(得分:0)

显然,只查看一个表的查询通常比进行连接的查询更快。但是,如果您的查询如下:

SELECT h.id, h.date, h.ip, h.user_id, hc.id, he.id
FROM history h LEFT JOIN
     history_connection hc
     ON h.id = hc.id LEFT JOIN
     history_email he
     ON h.id = he.id;

然后表现应该相当不错,有两个假设:

  • 您有适当的索引(history_connection(id)history_email(id))。
  • 表格不是太大(即它们适合记忆)。

相比之下,正如您所描述的那样,维护type列会产生额外的开销。您可以考虑将所有额外的列放在history中。存储NULL值的开销很小。