Alat pengembang · generator UUID
Kunci Utama UUID Acak dan Fragmentasi Pohon B: Apa yang Sebenarnya Terjadi
· Mengapa itu penting
uuid kriptografi browser-apis
Kunci v4 acak dimasukkan ke halaman indeks acak, dan indeks berkerumun membayarnya. Posting ini menjelaskan mekanisme, biaya penyimpanan teks versus biner, dan di mana UUID yang diurutkan waktu mengubah gambarannya.
Penyisipan melambat seiring bertambahnya tabel — gejala yang membuat DBA melihat pilihan utama mereka
Memasukkan baris dengan UUID acak sebagai kunci utama dalam database dengan indeks berkerumun menyebabkan database menyisipkan baris baru di lokasi acak dalam struktur B-tree. Kunci sekuensial ditambahkan ke halaman daun paling kanan, menyimpan semua sisipan dalam area kecil yang menyimpan cache. Kunci acak menyebarkan sisipan di seluruh indeks, memaksa database untuk melintasi dan memodifikasi halaman berjauhan di penyimpanan fisik. Saat tabel bertambah dan pohon semakin dalam, setiap sisipan menyentuh lebih banyak halaman dan menyebabkan lebih banyak operasi I/O. Operasi yang tadinya murah dalam seribu baris menjadi mahal dalam sejuta. Ini bukanlah masalah teoretis; ini bermanifestasi sebagai degradasi terukur dalam throughput penyisipan.
Bagaimana B-tree yang berkerumun terisi — kunci berurutan ditambahkan ke halaman terakhir; tombol acak menyentuh halaman di seluruh indeks
Mekanisme ini sangat penting dalam cara kerja B-tree karena mereka mempertahankan urutan kunci yang diurutkan dalam halaman daun. Saat Anda memasukkan baris dengan kunci 10,001 ke dalam tabel yang telah menyimpan kunci 1 hingga 10,000, database mengetahui di mana baris tersebut berada: di akhir, di halaman paling kanan yang ada jika ada ruang, atau di halaman baru yang ditambahkan ke kanan. Saat Anda menyisipkan baris dengan UUID acak seperti 7524fae2-7dec-11d0-a765-00a0c91e6bf6 ke dalam tabel yang sama, database harus menavigasi pohon untuk menemukan halaman daun yang berisi kunci dalam rentang UUID tersebut, temukan posisi yang tepat di dalam halaman itu dan masukkan baris tersebut. Jika halaman tersebut penuh, maka halaman tersebut akan terpecah, memindahkan separuh isinya ke halaman baru dan memperbarui node induk.
Pemisahan halaman dan tekanan cache — mengapa penyisipan acak membutuhkan biaya lebih banyak I/O dan mengapa efeknya bertambah seiring dengan ukuran tabel
Kunci acak menciptakan pola penyisipan kasus terburuk karena setiap penyisipan berada pada posisi acak di pohon alih-alih menambahkan ke halaman paling kanan. Basis data harus mencari halaman yang benar, yang biasanya memerlukan beberapa halaman untuk dibaca—satu halaman per tingkat pohon. Kemudian ia harus memodifikasi halaman tersebut, yang mungkin memicu perpecahan yang menyebar ke atas pohon. Semakin banyak halaman yang dimodifikasi, semakin banyak penulisan yang terjadi, dan kumpulan buffer memori terisi dengan halaman-halaman dari berbagai wilayah pohon daripada tetap fokus pada titik penyisipan aktif. Kesalahan cache meningkat dan I/O menjadi penghambat, dengan tingkat penyisipan tidak berubah seiring pertumbuhan tabel ke skala yang lebih besar.
Teks atau biner — string karakter 36 versus kolom uuid atau biner asli 16-byte (16) dan pengaruhnya terhadap ukuran indeks
Biayanya tidak seragam di seluruh mesin basis data karena sistem yang berbeda mengoptimalkan pengelolaan halaman secara berbeda. Basis data dengan kompresi agresif, ukuran halaman kecil, atau operasi dalam memori mungkin menunjukkan perbedaan kinerja yang lebih kecil antara kunci sekuensial dan acak. Basis data dengan halaman besar, disk mekanis, atau batas memori yang ketat akan menunjukkan degradasi yang dramatis. Masalahnya dapat diamati dan diukur: ukur tingkat penyisipan pada 1,000 baris, 100,000 baris, dan 1,000,000 baris. Jika kecepatan per detik turun tajam pada skala yang lebih besar, Anda mengalami penalti penyisipan acak dengan konfigurasi perangkat keras dan database spesifik Anda.
Alternatif berdasarkan waktu — bagaimana UUIDv7 dan ULID menjaga keunikan saat menyisipkan di akhir indeks
UUID sebagai string menggunakan 36 karakter dalam bentuk teks atau 16 bytes sebagai tipe biner UUID bergantung pada format penyimpanan yang dipilih. String 36 karakter dalam kolom UTF-8 atau ASCII adalah 36 bytes, dibandingkan dengan 8 bytes untuk bilangan bulat 64-bit. Indeks pada kolom string-UUID tiga kali lebih besar dari indeks pada kolom bilangan bulat, dengan asumsi tidak ada teknik kompresi yang diterapkan. Indeks yang lebih besar berarti lebih sedikit halaman indeks yang muat di kumpulan buffer, yang berarti lebih sedikit cache yang ditemukan saat melintasi pohon. Indeks yang lebih kecil yang cocok dengan RAM memiliki kinerja lebih baik daripada indeks besar yang harus dibaca dari disk pada setiap kueri, terlepas dari urutan penyisipan atau pola beban kerja.
Contoh praktis - beban kerja penyisipan yang sama yang dijelaskan untuk tabel kunci acak dan kunci yang diurutkan berdasarkan waktu, secara kualitatif, tanpa tolok ukur yang ditemukan
Perbedaan penyimpanan sangat berarti bagi indeks primer dan sekunder karena setiap indeks sekunder yang menyertakan kunci primer harus menyimpan seluruh karakter 36 UUID atau nilai biner 16-byte UUID. Hal ini membuat indeks sekunder jauh lebih besar daripada indeks yang menggunakan kunci integer untuk pencarian kunci primer. Replikasi, pencadangan, dan kumpulan hasil kueri semuanya tumbuh secara proporsional dengan ukuran indeks yang lebih besar. Generator ToolAcre UUID menghasilkan nilai yang kompatibel dengan biner; menyimpannya sebagai tipe biner(16) atau GUID bergantung pada database akan menghemat ruang dibandingkan dengan varchar(36) dan meningkatkan efisiensi cache secara menyeluruh. Optimalisasi penyimpanan ini sangat penting untuk sistem berskala besar.
Hal yang tidak tercakup dalam hal ini — tabel dan database yang terorganisir dengan tumpukan di mana kunci utama tidak dikelompokkan, dengan efek yang lebih kecil
Pengoptimalan yang umum adalah menyimpan UUID sebagai biner secara internal dan menampilkannya sebagai string hanya bila diperlukan untuk API atau antarmuka pengguna. Operasi indeks dan penggabungan bekerja pada bentuk biner kompak; respons API atau kode aplikasi diubah menjadi representasi string. Beberapa database menawarkan tipe GUID atau UUID bawaan yang menangani konversi ini secara otomatis. Lainnya memerlukan operasi casting yang eksplisit. Perbedaan kinerja antara kolom 36-byte dan 16-byte adalah nyata: tabel dengan satu juta baris dan kunci kolom 36-byte versus 16-byte UUID berbeda sebesar 20 MB per tingkat indeks, yang dapat menjadi perbedaan antara pemasangan indeks di cache L3 dan memerlukan pengambilan memori.
Kesimpulan: ketahui indeks Anda sebelum memilih versi — generator ToolAcre menghasilkan UUID acak; gunakan pos tersebut untuk memutuskan apakah itu sesuai dengan mesin penyimpanan Anda
Pertukaran antara performa penyisipan, ukuran indeks, dan karakteristik kueri memerlukan keputusan arsitektur berdasarkan pola beban kerja. Kunci string berurutan dapat dimasukkan dengan cepat jika string naik, misalnya string berbasis stempel waktu, tetapi akan menggunakan ruang yang sama dengan UUID acak dan membocorkan informasi temporal. UUID acak secara semantik lebih bersih dan tidak memiliki komponen stempel waktu yang bocor, tetapi lebih lambat untuk dimasukkan ke dalam indeks berkerumun dan penyimpanan yang lebih besar secara keseluruhan. Alternatif yang diatur waktu seperti UUIDv7 menggabungkan manfaat dengan mempertahankan lokalitas penyisipan sambil menghindari kebocoran stempel waktu di pengidentifikasi acak versi 4.