這里評分最高的答案提到了 MySQL 記錄如何按主索引的順序存盤。這是否意味著創建的主索引是稀疏索引?如果是這樣,如果通過更改構建主鍵的列或修改其中一個條目來修改主鍵會發生什么。
很抱歉在同一個帖子中問了 2 個問題,但我認為最好一起問。我在處理查詢時非常慢的表時遇到了這個疑問,所以我認為也許以某種基于表中實際列的方式插入行會有所幫助。
uj5u.com熱心網友回復:
我將回答 MySQL 的默認存盤引擎 InnoDB。這是您應該為 MySQL 中的所有表使用的存盤引擎,除非您有非常具體的理由不這樣做。
問題一的答案:主鍵不是稀疏索引。我知道該術語指的是僅具有表中行子集的值的索引。即帶有WHERE子句的索引。但是主鍵必須占表中的所有行。如果您需要唯一地參考任何單行,它就是您使用的一個或多個列。
即使聚集索引按主鍵值的順序存盤,它也不一定按該順序存盤在磁盤上。InnoDB 表空間中的每個頁面都有一個指向“下一個”頁面的鏈接,該頁面可能不會立即在物理上定位。它可能在檔案中更晚,甚至更早。這些頁面可能散布著其他索引的頁面(如果您使用共享表空間,甚至是其他表)。這就是稀疏索引的意思嗎?
問題 2 的答案:如果更改表的主鍵的列,則必須重組表的存盤。InnoDB 使用主鍵作為聚集索引,這意味著其余列與 B 樹資料結構的葉節點一起存盤。更改主鍵列可能會更改存盤順序,以及每個 B 樹節點(內部節點和葉節點)的大小。
這意味著當您重構主鍵時,您的服務器暫時需要大量額外的存盤空間——最多是表大小的兩倍。重組完成后,舊版本的表會自動洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/466819.html
下一篇:使用403回應還是404更好?
