Postgresql
字元變化索引成本和長度限制
我對字元變化列有一個獨特的約束,該列的長度大部分約為 600,但可能達到 1000 萬。
我已經閱讀過B-Trees,但我無法確定索引將消耗多少磁碟空間,或者這樣大的值是否會阻止索引正常執行。
B-Tree 索引對具有如此大長度的字元變化列的磁碟空間和時間有什麼影響?
在 Postgres 中,唯一約束是用唯一的B-tree index實現的。根據文件:
添加唯一約束將自動在約束中使用的列或列組上創建唯一 btree 索引。
索引使用與表相同的基本儲存機制:數據頁數組。索引有一些小的附加功能。根據文件:
在表格中,一個項目是一行;在索引中,一個項目是一個索引條目。
每個表和索引都儲存為一個固定大小的頁面數組(通常為 8 kB,儘管在編譯伺服器時可以選擇不同的頁面大小)。
索引條目的最大大小是數據頁的三分之一,我在此引用 Peter Eisentraut:
那是2730 字節(或更少)。這意味著您的
UNIQUE
約束是不可能的。我會考慮添加一個帶有雜湊值的冗餘列並在其上創建一個唯一索引。
您可以使用內置函式
md5()
或更有效的方法來獲取巨大的值。這是一個關注性能的相關解決方案: