我正在将数据库从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
策略?我自己有一个想法(下面张贴),但我不禁感到我可能错过了一些东西。当然,以前其他人一定处理过这个问题,也许有一个简单的方法来解决它。