Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menghindari fragmentasi saat menggunakan kunci utama NHibernate guid.comb di MySQL?

Sebagai diamati oleh Alberto Ferrari dan dibahas di sini di StackOverflow , Microsoft SQL Server mengurutkan GUID dengan membandingkan byte dalam urutan tertentu. Karena MySQL akan mengurutkan BINARY(16) "straight-foward", yang perlu kita lakukan, adalah menyusun ulang byte saat membaca/menulis ke database.

NHibernate memungkinkan kita untuk mendefinisikan tipe data kustom, yang dapat digunakan dalam pemetaan antara database dan objek. Saya telah menerapkan BinaryGuidType , mampu menyusun ulang byte yang dihasilkan oleh Guid.ToByteArray() menurut cara MSSQL mengurutkan GUID dan menyusunnya kembali ke format yang diterima oleh Guid(byte[]) konstruktor.

Urutan byte terlihat seperti ini:

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

Menyimpan System.Guid ke BINARY(16) seperti ini:

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);

Membaca byte kembali menjadi System.Guid seperti ini:

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];
}

Kode sumber lengkap untuk BinaryGuidType di sini.

Ini tampaknya bekerja dengan baik. Membuat dan mempertahankan 10.000 objek baru dalam tabel, mereka disimpan sepenuhnya secara berurutan, tanpa tanda-tanda fragmentasi indeks.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tampilan MySQL dan penggunaan indeks

  2. MySQL ALTER TABLE pada tabel terlalu besar untuk diduplikasi

  3. Permintaan MySQL:Cocokkan nilai yang dipisahkan koma dengan kolom yang berisi string yang dipisahkan koma

  4. Bagaimana cara mempercepat SELECT .. LIKE query di MySQL pada banyak kolom?

  5. Desain basis data / struktur normalisasi harus berisi AND, OR, elemen opsional dan hubungannya