Mysql
在索引列中包含結果列的性能影響
我有一個用於在 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)
texelx
,texely
然後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 檢索時,它將僅進行索引查找,因為所有提到的列都在索引中。它被稱為覆蓋指數。我在過去的文章中提到了覆蓋索引:
Mar 12, 2012
:如何索引這個表 (a_level, b_level, item_id)Oct 17, 2012
:合併索引中的列Nov 13, 2012
:索引是否必須覆蓋所有選定的列才能用於 ORDER BY?(見我的結論)因此,要回答您最初的問題,是的,添加
identifiedtex
索引會加快查詢速度。