Microsoft SQL Server から MySQL/MariaDB にデータベースを移行中です。MSSQL では、データベースはuniqueidentifier
すべての主キーに (GUID) データ型を使用します。NHibernate を使用してデータベースとアプリケーションの間でデータをマップしguid.comb
、クラスター化されたインデックスの断片化を回避するために GUID 生成にこの戦略を採用しています。
MySQL には専用の GUID データ型がないため、新しいデータベース スキーマはBINARY(16)
すべての識別子に使用します。NHibernate マッピングに変更を加えることなく、アプリケーションを起動し、新しいエンティティを保持して、MySQL データベースからそれらをロードすることができます。すごい!ただし、順次生成された GUID はBINARY(16)
列内で非常に非順次に並べられており、許容できないインデックスの断片化が発生していることが判明しました。
問題を読んでみると、MSSQL には GUID をソートするための非常に特殊な方法があることがわかりました。16 バイトは、最初に最後の 6 バイトで並べ替えられ、次に前置されたグループの逆順で並べ替えられますが、私の単純な MySQL 実装では、最初のバイトが最初に並べ替えられ、次に次のバイトが並べ替えられます。
そして、これは私の質問につながります:既存のGUIDとguid.comb
戦略を維持しながら、MySQLデータベースでこの断片化を回避するにはどうすればよいですか? 私は自分で解決策のアイデアを持っていますが(以下に投稿)、何かを見逃したのではないかと感じずにはいられません。確かに、他の人は以前にこの問題に対処したに違いありません。また、簡単な回避方法があるかもしれません。