我对SQL非常陌生,我试图弄清楚"最好的方法"在涉及多个表时执行选择。不幸的是,我的数据集非常小(从而使这个问题相当学术化),所以无论如何一切都在相同的时间内返回。
我有以下表格(但抽象数据名称较少):
mysql> describe tblA
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| A_data | varchar(20) | YES | | null | |
| B_ID | bigint(20) | NO | MUL | NULL | |
+----------------+-------------+------+-----+---------+----------------+
mysql> describe tblB
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| B_data | varchar(20) | YES | | null | |
| C_ID | bigint(20) | NO | MUL | NULL | |
+----------------+-------------+------+-----+---------+----------------+
mysql> describe tblC
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| C_data | varchar(20) | YES | | null | |
+----------------+-------------+------+-----+---------+----------------+
似乎有三种方法可以安排查询以获得给定C_data特定值的A_data:
SELECT A_data FROM tblA,tblB,tblC
WHERE (tblC.C_data=searchKey AND tblB.C_ID=tblC.ID AND tblA.B_ID=tblB.ID)
或
SELECT A_data FROM tblA
INNER JOIN tblB ON tblA.tblB_ID=tblB.ID
INNER JOIN tblC ON tblB.tblC_ID=tblC.ID
WHERE tblC.C_data=searchKey
或
SELECT A_data FROM tblA
WHERE tblB_ID IN (
SELECT ID FROM tblB WHERE tblC_ID IN (
SELECT ID FROM tblC WHERE tblC_data=searchKey
)
)
我对这些技术的相对分支和优点(如果有的话)感到好奇。例如,加入三个表只是为了进行搜索似乎打败了将它们保存在单独的表中的观点,但相反,我不确定嵌套选择的智慧。我还不确定第一个案例背景中究竟发生了什么。
答案 0 :(得分:1)
使用第二种形式。它是三者中最常见,最易读的。
答案 1 :(得分:0)
http://dev.mysql.com/doc/internals/en/optimizer-tracing.html - (官方oracle文档) http://jorgenloland.blogspot.com/2011/10/optimizer-tracing-query-execution-plan.html - (关于使用和输出及其含义的说明,来自优化器开发)