Mysql 选择继承性能:左外部联接与“超级表”类型列

Mysql 选择继承性能:左外部联接与“超级表”类型列,mysql,database,join,left-join,Mysql,Database,Join,Left Join,我有带继承的SQL表: 历史id、日期、ip用户id:超级表。 历史\连接id,用户\代理:映射用户的帐户连接。 历史记录\电子邮件id,电子邮件:映射用户的电子邮件修改。 目标是在我的数据库中记录关于用户的不同类型的历史记录。history_connection和history_email的id列都是指向历史表id的主键和外键 现在想象一下,在一个请求中,我不需要访问子表列,但我需要知道它是哪种类型的历史记录。立即,我想到左外连接: SELECT h.id,h.date,h.ip,h.user

我有带继承的SQL表:

历史id、日期、ip用户id:超级表。 历史\连接id,用户\代理:映射用户的帐户连接。 历史记录\电子邮件id,电子邮件:映射用户的电子邮件修改。 目标是在我的数据库中记录关于用户的不同类型的历史记录。history_connection和history_email的id列都是指向历史表id的主键和外键

现在想象一下,在一个请求中,我不需要访问子表列,但我需要知道它是哪种类型的历史记录。立即,我想到左外连接:

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

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

显然,只查看一个表的查询通常比执行联接的查询要快。但是,如果您的查询类似于:

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\u connectionid和history\u emailid。 这些桌子不是太大,也就是说,它们适合放在内存中。 相比之下,您将有额外的开销来维护类型列,正如您所描述的那样。你可以考虑把所有额外的列放在历史中。存储空值的开销很小。

您考虑的是左外连接,而使用的是内连接?