我是數據庫索引的新手,我剛剛讀到了什么是索引,聚集索引和非聚集索引的區別,以及什么是復合索引。
對于這樣的內部聯接查詢:
SELECT columnA
FROM table1
INNER JOIN table2
ON table1.columnA= table2.columnA;
為了加速join
,我應該創建兩個索引,一個用于table1.columnA
,另一個用于table2.columnA
,還是只為table1
或table2
創建一個索引?
一個就夠了?我不明白,例如,如果我首先從table2
中選擇一些數據,然后基于要在columnA
上連接的結果,然后我在table2
中一個接一個地循環結果,那么table2.columnA
中的索引在這里完全沒有用,因為我現在不需要在table2
中查找任何內容。所以我需要一個table1.columnA
的索引。
反之亦然,如果我首先從table1
中選擇一些結果并想加入columnA
,我需要一個table2.columnA
。
好吧,我不知道“先選擇xxxx,然后基于加入…”看起來是什么樣子,但我突然想到了這個場景。如果有人能舉個簡單的例子,我們將不勝感激。
一個索引就足夠了,但問題是哪一個?
這取決于MySQL優化器決定如何對連接中的表進行排序。
對于內部聯接,
table1 INNER JOIN table2
與table2 INNER JOIN table1
的結果相同,因此優化器可以選擇更改順序。它不受約束以您在查詢中指定的順序聯接表。索引透視圖的區別在于它是先循環表1的行,然后在表2中查找匹配的行,還是vice-versa:循環表2的行,然后在表1中查找行。
MySQL將連接作為“嵌套循環”。就好像你用你最喜歡的語言寫了這樣的代碼:
此查找將使用表2中的索引。表1中的索引與本例無關,因為您的查詢正在掃描表1的每一行。
你怎么知道用的是哪個表順序?你可以使用
EXPLAIN
。它將為查詢中的每個表引用顯示一行,并按聯接順序顯示它們。請記住,任何一個表中都存在索引,這可能會影響優化器選擇如何對表排序。它將嘗試選擇導致最便宜查詢的表順序。
因此,將索引添加到哪個表可能無關緊要,因為無論將索引放在哪個表上,都將成為連接順序中的第二個表,因為這樣做會更有效地進行查找。用解釋來找出答案。