Mysql

mysql 或 mariadb 是否有 SQL Server 的索引“包含列”的概念?

  • October 30, 2020

在 SQL Server 中,您可以創建一個索引並在該索引中包含其他列,這有助於在某些情況下提高性能。mysql 或 mariadb 是否可以以不同的名稱使用相同的功能?我無法使用“包含的列”一詞找到任何內容。

查看 MySQL 文件,詞彙表指出了有關Covering Indexes的內容:

包含查詢檢索到的所有列的索引。查詢不是使用索引值作為指針來查找完整的表行,而是從索引結構中返回值,從而節省磁碟 I/O。InnoDB 可以將此優化技術應用於比 MyISAM 更多的索引,因為 InnoDB 二級索引還包括主鍵列。InnoDB 不能將此技術應用於對事務修改的表的查詢,直到該事務結束。

給定正確的查詢,任何列索引或複合索引都可以充當覆蓋索引。設計您的索引和查詢以盡可能利用這種優化技術。

這裡的含義是在 MySQL 中沒有直接等效的INCLUDE語句,但是如果索引提供了索引中涉及的列的覆蓋,那麼很明顯,它仍然可以被認為是覆蓋的,就像包含列的索引一樣在 SQL Server 中會。

MariaDB 在其文件中包含以下用於覆蓋索引的內容:

“覆蓋”索引是包含 SELECT 中所有列的索引。特殊之處在於只看INDEX BTree就可以完成SELECT。(由於 InnoDB 的 PRIMARY KEY 與數據聚集在一起,“覆蓋”在考慮 PRIMARY KEY 時沒有任何好處。)

迷你食譜:

  1. 根據上面的“算法”收集列列表。
  2. 以任意順序將 SELECT 中看到的其餘列添加到列表的末尾。

例子:

SELECT x FROM t WHERE y = 5; ⇒ INDEX(y,x) -- The algorithm said just INDEX(y)  
SELECT x,z FROM t WHERE y = 5 AND q = 7; ⇒ INDEX(y,q,x,z) -- y and q in either order (Algorithm), then x and z in either order (covering).  
SELECT x FROM t WHERE y > 5 AND q > 7; ⇒ INDEX(y,q,x) -- y or q first (that's as far as the Algorithm goes), then the other two fields afterwards.   

您獲得的加速可能很小,也可能非常驚人;很難預測。

但…

  • 建構包含大量列的索引是不明智的。讓我們在 5(經驗法則)處切斷它。
  • 前綴索引不能“覆蓋”,所以不要在“覆蓋”索引的任何地方使用它們。
  • 索引可以有多“寬”是有限制的(3KB?),因此“覆蓋”可能是不可能的。

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