顯式與隱式SQL鏈接

顯式和隱式內部聯接是否存在效率差別? 例如: mysql

SELECT * FROM
table a INNER JOIN table b
ON a.id = b.id;

sql

SELECT a.*, b.*
FROM table a, table b
WHERE a.id = b.id;

#1樓

在MySQL 5.1.51上,兩個查詢的執行計劃相同: 數據庫

mysql> explain select * from table1 a inner join table2 b on a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.02 sec)

mysql> explain select * from table1 a, table2 b where a.pid = b.pid;
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref          | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
|  1 | SIMPLE      | b     | ALL  | PRIMARY       | NULL | NULL    | NULL         |  986 |       |
|  1 | SIMPLE      | a     | ref  | pid           | pid  | 4       | schema.b.pid |   70 |       |
+----+-------------+-------+------+---------------+------+---------+--------------+------+-------+
2 rows in set (0.00 sec)

table1具備166208行; table2大約有1000行。 性能

這是一個很是簡單的狀況; 它毫不證實查詢優化器不會在更復雜的狀況下產生混亂並生成不一樣的計劃。 優化


#2樓

第二種語法具備交叉聯接的可能性:您能夠將表添加到FROM部分,而無需相應的WHERE子句。 這被認爲是有害的。 spa


#3樓

以個人經驗,使用子句中的交叉聯接經常會致使大腦受損的執行計劃,尤爲是在使用Microsoft SQL產品的狀況下。 例如,SQL Server嘗試估算錶行數的方法很是可怕。 使用內部聯接語法使您能夠控制查詢的執行方式。 所以,從實際的角度來看,鑑於當前數據庫技術的簡單性,您必須使用內部聯接。 code


#4樓

在性能方面,它們是徹底相同的(至少在SQL Server中)。 get

PS:請注意,自SQL Server 2005起不建議使用IMPLICIT OUTER JOIN語法。(仍支持問題中使用的IMPLICIT INNER JOIN語法) 產品

棄用「舊樣式」 JOIN語法:只是部分事情 io


#5樓

就我我的而言,我更喜歡鏈接語法,由於它能夠更清楚地代表表是如何鏈接以及如何鏈接的。 嘗試比較較大的SQL查詢,從8個不一樣的表中進行選擇,而後在where中進行大量篩選。 經過使用聯接語法,您能夠將聯接表的部分分離到要過濾行的部分。

相關文章
相關標籤/搜索