sql >> データベース >  >> RDS >> Mysql

MySQLでNHibernateguid.comb主キーを使用するときに断片化を回避するにはどうすればよいですか?

    としてアルベルトフェラーリによる観察 およびここでStackOverflowについて説明しました 、Microsoft SQL Serverは、特定の順序でバイトを比較することによってGUIDを並べ替えます。 MySQLはBINARY(16)をソートするので 「ストレートフォワード」は、データベースの読み取り/書き込み時にバイトを並べ替えるだけです。

    NHibernateを使用すると、データベースとオブジェクト間のマッピングで使用できるカスタムデータ型を定義できます。 BinaryGuidTypeを実装しました 、Guid.ToByteArray() MSSQLがGUIDを並べ替えて、で受け入れられる形式に並べ替える方法に従って、 Guid(byte[]) コンストラクター。

    バイトオーダーは次のようになります:

    int[] ByteOrder = new[] { 10,11,12,13,14,15,8,9,6,7,4,5,0,1,2,3 };
    

    System.Guidを保存する BINARY(16)に このようになります:

    var bytes = ((Guid) value).ToByteArray();
    var reorderedBytes = new byte[16];
    
    for (var i = 0; i < 16; i++)
    {
        reorderedBytes[i] = bytes[ByteOrder[i]];
    }
    
    NHibernateUtil.Binary.NullSafeSet(cmd, reorderedBytes, index);
    

    バイトをSystem.Guidに読み戻します このようになります:

    var bytes = (byte[]) NHibernateUtil.Binary.NullSafeGet(rs, names[0]);
    if (bytes == null || bytes.Length == 0) return null;
    
    var reorderedBytes = new byte[16];
    
    for (var i = 0 ; i < 16; i++)
    {
        reorderedBytes[ByteOrder[i]] = bytes[i];
    }
    

    BinaryGuidTypeの完全なソースコード ここ。

    これはうまくいくようです。テーブルに10.000個の新しいオブジェクトを作成して永続化すると、インデックスの断片化の兆候がなく、完全に順番に保存されます。




    1. 外部キー制約エラーが発生したときにMySQLで無効な値をキャッチすることは可能ですか?

    2. SQL Serverデータベースの回復保留状態を修正するにはどうすればよいですか?

    3. MYSQLWorkbenchで構文エラーを宣言する

    4. C ++でmysqlを使用するにはどうすればよいですか?