Bahasa Melayu

Alat pembangun · UUID penjana

Random UUID Kunci Utama dan Pecahan B-Tree: Apa Yang Sebenarnya Berlaku

· Mengapa ia penting

uuid kriptografi pelayar-apis

Gambar rajah pokok B menunjukkan sisipan berurutan mengisi satu halaman berbanding sisipan rawak yang bertaburan di beberapa halaman
Ilustrasi vektor ToolAcre asal

Kekunci v4 rawak dimasukkan ke dalam halaman indeks rawak, dan indeks berkelompok membayarnya. Siaran ini menerangkan mekanisme, kos storan teks berbanding binari, dan tempat UUID yang ditempah masa menukar gambar.

Sisipan perlahan apabila jadual berkembang — gejala yang menghantar DBA melihat pilihan utama mereka

Memasukkan baris dengan UUID rawak sebagai kunci utama dalam pangkalan data dengan indeks berkelompok menyebabkan pangkalan data memasukkan baris baharu pada lokasi rawak dalam struktur B-tree. Kekunci berjujukan dilampirkan pada halaman daun paling kanan, mengekalkan semua sisipan dalam kawasan kecil yang bermastautin cache. Kekunci rawak menyerakkan sisipan merentasi keseluruhan indeks, memaksa pangkalan data merentasi dan mengubah suai halaman berjauhan dalam storan fizikal. Apabila jadual membesar dan pokok semakin dalam, setiap sisipan menyentuh lebih banyak halaman dan menyebabkan lebih banyak operasi I/O. Operasi yang kelihatan murah pada seribu baris menjadi mahal pada sejuta. Ini bukan masalah teori; ia nyata sebagai kemerosotan yang boleh diukur dalam daya pemprosesan sisipan.

Bagaimana pokok B berkelompok mengisi — kunci berjujukan dilampirkan pada halaman terakhir; kekunci rawak menyentuh halaman di seluruh indeks

Mekanisme ini adalah asas kepada cara pokok B berfungsi kerana ia mengekalkan susunan kunci yang diisih dalam halaman daun. Apabila anda memasukkan baris dengan kunci 10,001 ke dalam jadual yang telah menyimpan kunci 1 melalui 10,000, pangkalan data mengetahui di mana baris itu berada: pada penghujungnya, dalam halaman paling kanan sedia ada jika terdapat ruang, atau dalam halaman baharu yang dilampirkan di sebelah kanan. Apabila anda memasukkan baris dengan UUID rawak seperti 7524fae2-7dec-11d0-a765-00a0c91e6bf6 ke dalam jadual yang sama, pangkalan data mesti menavigasi pepohon untuk mencari halaman daun yang mengandungi kunci dalam julat UUID itu, cari halaman tersebut dan masukkan kedudukan tepat pada baris tersebut Jika halaman itu penuh, ia berpecah, memindahkan separuh kandungannya ke halaman baharu dan mengemas kini nod induk.

Pemisahan halaman dan tekanan cache — mengapa penyisipan rawak kos lebih tinggi I/O dan mengapa kesannya berkembang dengan saiz jadual

Kekunci rawak mencipta corak sisipan kes terburuk kerana setiap sisipan mendarat pada kedudukan rawak dalam pepohon dan bukannya dilampirkan pada halaman paling kanan. Pangkalan data mesti mencari halaman yang betul, yang biasanya menelan kos beberapa bacaan halaman—satu setiap tahap pokok. Kemudian ia mesti mengubah suai halaman itu, yang mungkin mencetuskan perpecahan yang menyebarkan pokok itu. Lebih banyak halaman diubah suai, lebih banyak penulisan berlaku, dan kolam penimbal memori diisi dengan halaman dari kawasan pokok yang berbeza daripada terus fokus pada titik sisipan aktif. Cache terlepas meningkat dan I/O menjadi hambatan, dengan kadar sisipan meningkat apabila jadual berkembang ke skala yang lebih besar.

Teks atau binari — 36-rentetan aksara berbanding 16-bait lajur uuid asli atau binari(16) dan kesan pada saiz indeks

Kos tidak seragam merentas enjin pangkalan data kerana sistem yang berbeza mengoptimumkan pengurusan halaman secara berbeza. Pangkalan data dengan pemampatan agresif, saiz halaman kecil atau operasi dalam memori mungkin menunjukkan perbezaan prestasi yang lebih kecil antara kekunci berjujukan dan rawak. Pangkalan data dengan halaman besar, cakera mekanikal atau had memori yang ketat akan menunjukkan kemerosotan yang dramatik. Masalahnya boleh diperhatikan dan boleh diukur: ukur kadar sisipan pada 1,000 baris, 100,000 baris dan 1,000,000 baris. Jika kadar sesaat menurun secara mendadak pada skala yang lebih besar, anda sedang mengalami penalti sisipan rawak dengan konfigurasi perkakasan dan pangkalan data khusus anda.

Alternatif mengikut masa — cara UUIDv7 dan ULID mengekalkan keunikan semasa memasukkan pada penghujung indeks

UUID sebagai rentetan menggunakan 36 aksara dalam bentuk teks atau 16 bytes sebagai jenis UUID perduaan bergantung pada format storan yang dipilih. Rentetan aksara 36 dalam lajur UTF-8 atau ASCII ialah 36 bytes, berbanding 8 bytes untuk integer 64-bit. Indeks pada lajur rentetan-UUID adalah tiga kali lebih besar daripada indeks pada lajur integer, dengan mengandaikan tiada teknik mampatan digunakan. Indeks yang lebih besar bermakna lebih sedikit halaman indeks muat dalam kumpulan penimbal, yang bermaksud lebih sedikit capan cache apabila melintasi pokok. Indeks yang lebih kecil yang sesuai dengan RAM berprestasi lebih baik daripada indeks besar yang mesti dibaca daripada cakera pada setiap pertanyaan, tanpa mengira susunan sisipan atau corak beban kerja.

Contoh yang berfungsi — beban kerja sisipan yang sama yang diterangkan untuk kekunci rawak dan jadual kekunci tersusun masa, secara kualitatif, tanpa penanda aras yang dicipta

Perbezaan storan adalah penting untuk kedua-dua indeks primer dan sekunder kerana setiap indeks sekunder yang termasuk kunci utama mesti menyimpan nilai 36-aksara UUID atau 16-bait perduaan UUID penuh. Ini menjadikan indeks sekunder jauh lebih besar daripada indeks menggunakan kunci integer untuk carian kunci utama. Replikasi, sandaran dan set hasil pertanyaan semuanya berkembang secara berkadar dengan saiz indeks yang lebih besar. Penjana ToolAcre UUID menghasilkan nilai serasi binari; menyimpannya sebagai jenis binari(16) atau GUID bergantung pada pangkalan data menjimatkan ruang berbanding varchar(36) dan meningkatkan kecekapan cache di seluruh papan. Pengoptimuman storan ini penting untuk sistem berskala besar.

Perkara ini tidak meliputi — jadual timbunan tersusun dan pangkalan data di mana kunci utama tidak dikelompokkan, di mana kesannya lebih kecil

Pengoptimuman biasa adalah untuk menyimpan UUID sebagai binari secara dalaman dan memaparkannya sebagai rentetan sahaja apabila diperlukan untuk API atau antara muka pengguna. Operasi indeks dan gabungan berfungsi pada bentuk binari padat; yang API respons atau kod aplikasi bertukar kepada perwakilan rentetan. Sesetengah pangkalan data menawarkan terbina dalam GUID atau UUID jenis yang mengendalikan penukaran ini secara automatik. Yang lain memerlukan operasi pemutus yang jelas. Perbezaan prestasi antara 36-bait dan 16lajur -bait adalah nyata: jadual dengan sejuta baris dan a 36-bait berbanding 16-bait UUID kunci lajur berbeza dengan 20 MB setiap tahap indeks, yang boleh menjadi perbezaan antara pemasangan indeks dalam cache L3 dan memerlukan pengambilan memori.

Bawa pulang: ketahui indeks anda sebelum anda memilih versi — penjana ToolAcre menghasilkan UUID rawak; gunakan siaran untuk memutuskan sama ada ia sesuai dengan enjin storan anda

Pertukaran antara prestasi sisipan, saiz indeks dan ciri pertanyaan memerlukan keputusan seni bina berdasarkan corak beban kerja. Kunci rentetan berjujukan boleh dimasukkan dengan pantas jika rentetan itu menaik contohnya, rentetan berasaskan cap waktu, tetapi akan menggunakan ruang yang sama seperti UUID rawak dan membocorkan maklumat temporal. UUID rawak adalah lebih bersih dari segi semantik dan tidak mempunyai komponen cap masa untuk bocor, tetapi lebih perlahan untuk dimasukkan ke dalam indeks berkelompok dan lebih besar dalam storan secara keseluruhan. Alternatif mengikut masa seperti UUIDv7 menggabungkan faedah dengan mengekalkan lokaliti sisipan sambil mengelakkan kebocoran cap masa dalam versi 4 pengecam rawak.