顯式和隱式內部聯接是否存在效率差別? 例如: 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;
在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行。 性能
這是一個很是簡單的狀況; 它毫不證實查詢優化器不會在更復雜的狀況下產生混亂並生成不一樣的計劃。 優化
第二種語法具備交叉聯接的可能性:您能夠將表添加到FROM部分,而無需相應的WHERE子句。 這被認爲是有害的。 spa
以個人經驗,使用子句中的交叉聯接經常會致使大腦受損的執行計劃,尤爲是在使用Microsoft SQL產品的狀況下。 例如,SQL Server嘗試估算錶行數的方法很是可怕。 使用內部聯接語法使您能夠控制查詢的執行方式。 所以,從實際的角度來看,鑑於當前數據庫技術的簡單性,您必須使用內部聯接。 code
在性能方面,它們是徹底相同的(至少在SQL Server中)。 get
PS:請注意,自SQL Server 2005起不建議使用IMPLICIT OUTER JOIN
語法。(仍支持問題中使用的IMPLICIT INNER JOIN
語法) 產品
就我我的而言,我更喜歡鏈接語法,由於它能夠更清楚地代表表是如何鏈接以及如何鏈接的。 嘗試比較較大的SQL查詢,從8個不一樣的表中進行選擇,而後在where中進行大量篩選。 經過使用聯接語法,您能夠將聯接表的部分分離到要過濾行的部分。