我應該為同一列創建兩個索引來加速連接嗎?

我是數據庫索引的新手,我剛剛讀到了什么是索引,聚集索引和非聚集索引的區別,以及什么是復合索引。

對于這樣的內部聯接查詢:

SELECT columnA
FROM table1
INNER JOIN table2
ON table1.columnA= table2.columnA;

為了加速join,我應該創建兩個索引,一個用于table1.columnA,另一個用于table2.columnA,還是只為table1table2創建一個索引?

一個就夠了?我不明白,例如,如果我首先從table2中選擇一些數據,然后基于要在columnA上連接的結果,然后我在table2中一個接一個地循環結果,那么table2.columnA中的索引在這里完全沒有用,因為我現在不需要在table2中查找任何內容。所以我需要一個table1.columnA的索引。

反之亦然,如果我首先從table1中選擇一些結果并想加入columnA,我需要一個table2.columnA

好吧,我不知道“先選擇xxxx,然后基于加入…”看起來是什么樣子,但我突然想到了這個場景。如果有人能舉個簡單的例子,我們將不勝感激。

? 最佳回答:

一個索引就足夠了,但問題是哪一個?

這取決于MySQL優化器決定如何對連接中的表進行排序。

對于內部聯接,table1 INNER JOIN table2table2 INNER JOIN table1的結果相同,因此優化器可以選擇更改順序。它不受約束以您在查詢中指定的順序聯接表。

索引透視圖的區別在于它是先循環表1的行,然后在表2中查找匹配的行,還是vice-versa:循環表2的行,然后在表1中查找行。

MySQL將連接作為“嵌套循環”。就好像你用你最喜歡的語言寫了這樣的代碼:

foreach row in table1 {
  look up rows in table2 matching table1.column_name
}

此查找將使用表2中的索引。表1中的索引與本例無關,因為您的查詢正在掃描表1的每一行。

你怎么知道用的是哪個表順序?你可以使用EXPLAIN。它將為查詢中的每個表引用顯示一行,并按聯接順序顯示它們。

請記住,任何一個表中都存在索引,這可能會影響優化器選擇如何對表排序。它將嘗試選擇導致最便宜查詢的表順序。

因此,將索引添加到哪個表可能無關緊要,因為無論將索引放在哪個表上,都將成為連接順序中的第二個表,因為這樣做會更有效地進行查找。用解釋來找出答案。

主站蜘蛛池模板: 国产精品无码亚洲一区二区三区| 人妻AV中文字幕一区二区三区 | 在线播放一区二区| 国产一区在线视频观看| 乱码精品一区二区三区| 在线观看国产区亚洲一区成人 | 亚洲高清一区二区三区电影| 色多多免费视频观看区一区| 中文字幕乱码亚洲精品一区| 精品人伦一区二区三区潘金莲| 日韩人妻无码一区二区三区综合部| 国产凸凹视频一区二区| 精品无码综合一区二区三区| 国产美女在线一区二区三区| 91精品福利一区二区三区野战| 一区二区视频传媒有限公司| 国产激情一区二区三区 | 搜日本一区二区三区免费高清视频| 成人国产精品一区二区网站公司| 国产在线乱子伦一区二区| 麻豆AV一区二区三区久久| 日韩一区二区三区无码影院 | 国产福利一区二区| 怡红院美国分院一区二区 | 无码人妻久久一区二区三区免费丨| 日韩免费无码视频一区二区三区| 亚洲国产综合精品中文第一区| 中文人妻av高清一区二区| 国产无套精品一区二区 | 一本大道在线无码一区| 国产精品夜色一区二区三区| 欧美日韩一区二区成人午夜电影 | 精品一区高潮喷吹在线播放| 国内自拍视频一区二区三区| AV天堂午夜精品一区二区三区| 无码人妻一区二区三区av| 国产一区二区三区无码免费| 亚洲AⅤ视频一区二区三区| 亚洲日韩国产精品第一页一区| 无码毛片视频一区二区本码| 欧美成人aaa片一区国产精品|