2010-03-15 42 views
0

對不起,如果這太簡單了,但在此先感謝您的幫助。這是針對MySQL的,但可能與其他RDMBS相關對於從MySQL中提取大型表的子集,索引,表順序如何影響查詢速度?

tblA有4列:colA,colB,colC,mydata,A_id 它有大約10^9個記錄,colA,colB,colC有10^3個不同的值。

tblB有3列:colA,colB,B_id 它有大約10^4條記錄。

我想要tblA中的所有記錄(除了A_id)在tblB中有匹配。換句話說,我想用tblB來描述我想提取的子集,然後從tblA中提取這些記錄。即:

SELECT a.colA, a.colB, a.colC, a.mydata 
FROM tblA as a 
INNER JOIN tblB as b 
ON 
    a.colA=b.colA 
    a.colB=b.colB 
; 

它採取了新望電腦(4GB,Core2Quad,Ubuntu的),在很長一段時間(超過一小時),我只是想看看我的下列優化步驟的理解。

**假設這是我將在這些表上運行的唯一查詢。所以忽略了運行其他查詢的需要。

現在我的問題:

  1. 我應該創建哪些索引來優化這個查詢? 我想我只需要在兩個表上的(colA,colB)上有一個多重索引。 我不認爲我需要單獨的colA和colB索引。 另一個堆棧溢出文章(我找不到)提到,當添加新索引時,當存在現有索引時,它會變慢,因此可能是使用多索引的原因。

  2. INNER JOIN正確嗎?我只想要找到匹配的結果。

  3. 如果我加入(tblA到tblB)或其他方式(tblB到tblA),它會更快嗎? 這previous answer說優化器應該照顧。

  4. ON後部分的順序是否重要? 這previous answer說,優化程序還負責執行順序。

回答

1

1)我應該創建哪些索引來優化這個查詢?

即使列僅在SELECT子句中引用,索引也可以提供幫助。所以,我可以在TABLE_A創建一個覆蓋索引,在下列順序列:

  1. 可樂
  2. COLB
  3. COLC
  4. MYDATA

對於TABLE_B

  1. colA
  2. COLB

順序是很重要的,因爲索引處理從左至右,以滿足標準的索引使用。 IE:如果沒有colA和colB在查詢中,colC不會觸發索引,並且colB不會在沒有colA引用的情況下觸發索引使用,依此類推...但是colC不需要被引用來觸發索引使用。

2)INNER JOIN正確嗎?我只想要找到匹配的結果。

是的,這對您的要求是正確的。

3)如果我加入(tblA到tblB)或其他方式(tblB到tblA),它會更快嗎?

測試和比較。

4)ON之後部分的順序是否重要?

不,沒關係。

相關問題