Mysql

在索引列中包含結果列的性能影響

  • August 10, 2017

我有一個用於在 3D 圖像中辨識紋理的數據庫(在 MySQL 中,使用 InnoDB)。在其中,將有一個包含色調的紋素(紋理像素)表,其形式為:

texelid INT (PK AI NN)
texelx TINYINT (NN)
texely TINYINT (NN)
texelhue INT (NN)
identifiedtex INT (NN) 

Identifiedtex 是一個已辨識tex 與許多 texels(紋理元素)的 1:N 關係中的外鍵

如果我使用 , 創建一個索引(B-tree)texelxtexely然後texelhue我可以快速找到一行。但是,如果我添加identifiedtex為索引中索引的最後一列,由於結果是索引的一部分,這會加快紋理的查找速度嗎?需要注意的是,texelx、texely 和 texelhue 的組合會產生多個已辨識的tex,並且需要查找幾個不同的行來辨識紋理。

我計劃通過對同一個表使用內部連接(自連接)來辨識紋理,以便找到具有匹配 X、匹配 Y 和匹配色調的行,並按不同的已辨識文本進行分組。

根據提供的資訊,我將嘗試回答…

你說

如果我將identifiedtex 添加為索引中索引的最後一列,由於結果是索引的一部分,這會加快紋理的查找速度嗎?

讓我說您有以下查詢:

SELECT identifiedtex FROM texels
WHERE texelx = 210938
AND texely = 378432
AND texelhue = 23;

有一個索引會有什麼影響(稱之為 Index3)

texelx, texely, texelhue

與此索引相比(稱為 Index4)

texelx, texely, texelhue, identifiedtex 

當您identifiedtex僅使用 Index3 檢索時,將需要額外的表查找來確定identifiedtex表中的值。

當您identifiedtex僅使用 Index4 檢索時,它將僅進行索引查找,因為所有提到的列都在索引中。它被稱為覆蓋指數。

我在過去的文章中提到了覆蓋索引:

因此,要回答您最初的問題,是的,添加identifiedtex索引會加快查詢速度。

引用自:https://dba.stackexchange.com/questions/31258