考慮一個只有兩個列的表,如col1
和col2
。mysql - 查找具有共同字段的行的最快方法
我想找到最快的方法來計算所有的行col2
等於col2
列col1
行等於給定的值。
例如,考慮的情況下,要找到所有有一個人的名字是「約翰」
考慮一個只有兩個列的表,如col1
和col2
。mysql - 查找具有共同字段的行的最快方法
我想找到最快的方法來計算所有的行col2
等於col2
列col1
行等於給定的值。
例如,考慮的情況下,要找到所有有一個人的名字是「約翰」
SELECT
t.*
FROM table t
JOIN table t2 ON t2.col2 = t.col2
WHERE t2.col1 = 'some value'
您需要在兩列上都有索引才能獲得良好的性能。
+1:儘管在這裏寫了另一個答案,但這並不使用20年前的語法,而現在在大多數RDBMS中都已棄用。 *(爲什麼人們覺得使用顯式連接非常困難?)* – MatBailie
基本上你需要這個查詢的同姓的人的名字:
select
t1.col1
from
table t1,
table t2
where
t2.col1='John' and
t1.col2=t2.col2
如果向col1,col2字段添加索引,它應該足夠快。
如果您想生成大量數據的輸出表,那麼可能臨時創建表將是最快的。
這個查詢完全按照@Vatev提出的查詢執行,所以我也提出了你的答案。我選擇他是因爲明確加入 – marcosh
在SQL中,它通常是最快的,當你只是寫你想要的。你需要來自table2的所有記錄,其中col2位於特定集合中。這個集合全是col2,其中col1是'John'。
select * from tablex
where col2 in (select col2 from tablex where col1 = 'John');
col1上的索引將幫助您快速找到John。 col2上的索引將幫助您找到其他人。
有很多方法可以選擇你想要的數據。現代dbms可以查看您的查詢並找到選擇數據的最佳方式。所以它可能是你重新編寫查詢,但是dbms注意到它實際上是相同的查詢並且使用相同的執行計劃。
所以你的第一個目標應該是:使查詢可讀。這裏有兩件事你要做:查找John(內部查詢),找到其他人(外部查詢)。所以你不加入表格,因爲你只想看到來自tablex的記錄和某些姓氏。在內部,dbms很可能決定將tablex與自己結合,然後進行過濾。但這取決於dbms,不必打擾你。 (雖然很高興知道你可以通過自連接,存在子句和其他方式實現同樣的效果)。
所以要澄清,鑑於「約翰史密斯」,你會想找到「簡史密斯「,」比爾史密斯「和」朱迪史密斯「以及? –
@MichaelBerkowski是的,正好在MySQL 5.5.35中的 – marcosh