我正在將數據庫從Microsoft SQL Server遷移到MySQL/MariaDB。在MSSQL上,數據庫對所有主鍵使用uniqueidentifier
(GUID)數據類型。 NHibernate用於在數據庫和應用程序之間映射數據,並且採用guid.comb
策略來生成GUID以避免聚簇索引的碎片化。如何避免在MySQL中使用NHibernate guid.comb主鍵時出現碎片?
MySQL沒有專用的GUID數據類型,新數據庫模式對所有標識符都使用BINARY(16)
。在不對NHibernate映射做任何更改的情況下,我可以啓動我們的應用程序,堅持新的實體並從MySQL數據庫加載它們。大!但是,事實證明,在BINARY(16)
列中產生了不連續的非序列GUID,導致不可接受的索引碎片。
讀到這個問題,事實證明MSSQL has a quite special method for sorting GUIDs。這16個字節先按最後六個字節排序,然後再按前後排列的順序排列,而我的天真的MySQL實現先排序第一個字節,然後排序第二個字節,然後轉發。
這導致我的問題:如何避免這種MySQL數據庫中的碎片,同時保持現有的GUIDs和guid.comb
策略?我自己有一個想法(下面張貼),但我不禁感到我可能錯過了一些東西。當然,以前其他人一定處理過這個問題,也許有一個簡單的方法來解決它。