我對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 | |
+----------------+-------------+------+-----+---------+----------------+
似乎有三種方式,我可以安排一個查詢來獲取A_data給出一個特定的值C_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
)
)
我很好奇這些技術的相對衍生和優點(如果有的話)。例如,加入三張表只是爲了進行搜索,似乎打敗了將它們保存在單獨表格中的觀點,但相反,我不確定嵌套選擇的智慧。我也不清楚第一個案例背景中發生了什麼。
版本A是使用舊標準的連接語法。完全有效並且應該導致與使用更新標準的選項B相同的性能。選項C是迄今爲止表現最差的。系統必須首先實現兩個子選擇以獲得期望的結果。此外,如果您需要來自tblB或tblC的信息,則選項C將不起作用。這不是一個「JOIN」 – xQbert