2014-03-24 70 views
0

考慮一個只有兩個列的表,如col1col2mysql - 查找具有共同字段的行的最快方法

我想找到最快的方法來計算所有的行col2等於col2col1行等於給定的值。

例如,考慮的情況下,要找到所有有一個人的名字是「約翰」

+0

所以要澄清,鑑於「約翰史密斯」,你會想找到「簡史密斯「,」比爾史密斯「和」朱迪史密斯「以及? –

+0

@MichaelBerkowski是的,正好在MySQL 5.5.35中的 – marcosh

回答

3
SELECT 
t.* 
FROM table t 
JOIN table t2 ON t2.col2 = t.col2 
WHERE t2.col1 = 'some value' 

您需要在兩列上都有索引才能獲得良好的性能。

+0

+1:儘管在這裏寫了另一個答案,但這並不使用20年前的語法,而現在在大多數RDBMS中都已棄用。 *(爲什麼人們覺得使用顯式連接非常困難?)* – MatBailie

2

基本上你需要這個查詢的同姓的人的名字:

select 
    t1.col1 
from 
    table t1, 
    table t2 
where 
    t2.col1='John' and 
    t1.col2=t2.col2 

如果向col1,col2字段添加索引,它應該足夠快。

如果您想生成大量數據的輸出表,那麼可能臨時創建表將是最快的。

+0

這個查詢完全按照@Vatev提出的查詢執行,所以我也提出了你的答案。我選擇他是因爲明確加入 – marcosh

0

在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,不必打擾你。 (雖然很高興知道你可以通過自連接,存在子句和其他方式實現同​​樣的效果)。

+0

不幸的是,MySQL在優化子查詢方面可能非常愚蠢。它在5.6.14上運行正常,但是當我在5.5.35上嘗試時,它將它變成了一個依賴子查詢。 – Vatev

+0

我也在5.5.35中試過,並且用一張581262行的表格,查詢爆炸了...... – marcosh

+0

聽起來很可怕。似乎我很幸運,不必使用MySQL。我很抱歉給出了一個不好的建議。我不知道,dbms會發現很難處理這樣簡單的查詢。 –

相關問題