Mengapa itu dibutuhkan?
Ketika data disimpan pada perangkat penyimpanan berbasis disk, itu disimpan sebagai blok data. Blok-blok ini diakses secara keseluruhan, menjadikannya operasi akses disk atom. Blok disk disusun dengan cara yang hampir sama dengan daftar tertaut; keduanya berisi bagian untuk data, penunjuk ke lokasi simpul berikutnya (atau blok), dan keduanya tidak perlu disimpan secara bersamaan.
Karena kenyataan bahwa sejumlah catatan hanya dapat diurutkan pada satu bidang, kami dapat menyatakan bahwa pencarian di bidang yang tidak diurutkan memerlukan Pencarian Linear yang memerlukan N/2
akses blok (rata-rata), di mana N
jumlah blok yang bentang meja. Jika bidang itu adalah bidang non-kunci (yaitu tidak mengandung entri unik) maka seluruh tablespace harus dicari di N
blok akses.
Sedangkan dengan bidang yang diurutkan, Pencarian Biner dapat digunakan, yang memiliki log2 N
akses blok. Juga karena data diurutkan diberi bidang non-kunci, sisa tabel tidak perlu dicari untuk nilai duplikat, setelah nilai yang lebih tinggi ditemukan. Dengan demikian peningkatan kinerja sangat besar.
Apa itu pengindeksan?
Pengindeksan adalah cara menyortir sejumlah catatan pada berbagai bidang. Membuat indeks pada bidang dalam tabel membuat struktur data lain yang menyimpan nilai bidang, dan penunjuk ke catatan yang terkait dengannya. Struktur indeks ini kemudian disortir, memungkinkan Pencarian Biner dilakukan di dalamnya.
Kelemahan dari pengindeksan adalah bahwa indeks ini memerlukan ruang tambahan pada disk karena indeks disimpan bersama dalam tabel menggunakan mesin MyISAM, file ini dapat dengan cepat mencapai batas ukuran sistem file yang mendasarinya jika banyak bidang dalam tabel yang sama diindeks .
Bagaimana cara kerjanya?
Pertama, mari kita garis besar skema tabel database sampel;
Nama bidang Tipe data Ukuran pada disk
id (kunci utama) INT 4 byte
firstName Char (50) 50 byte
lastName Char (50) 50 byte
emailAddress Char (100) 100 byte
Catatan : char digunakan sebagai pengganti varchar untuk memungkinkan ukuran yang akurat pada nilai disk. Database sampel ini berisi lima juta baris dan tidak terindeks. Kinerja beberapa pertanyaan sekarang akan dianalisis. Ini adalah query menggunakan id (a diurutkan bidang kunci) dan satu menggunakan firstName (bidang non-key unsorted).
Contoh 1 - bidang yang diurutkan vs yang tidak disortir
Diberikan basis data sampel kami r = 5,000,000
catatan ukuran tetap memberikan catatan panjang R = 204
byte dan mereka disimpan dalam tabel menggunakan mesin MyISAM yang menggunakan B = 1,024
byte ukuran blok standar . Faktor pemblokiran tabel adalah bfr = (B/R) = 1024/204 = 5
rekaman per blok disk. Jumlah total blok yang diperlukan untuk memegang tabel adalah N = (r/bfr) = 5000000/5 = 1,000,000
blok.
Pencarian linear pada bidang id akan memerlukan rata-rata N/2 = 500,000
akses blok untuk menemukan nilai, mengingat bahwa bidang id adalah bidang kunci. Tetapi karena bidang id juga disortir, pencarian biner dapat dilakukan yang membutuhkan rata-rata log2 1000000 = 19.93 = 20
akses blokir. Secara instan kita bisa melihat ini adalah peningkatan yang drastis.
Sekarang bidang firstName tidak diurutkan atau tidak bidang kunci, sehingga pencarian biner tidak mungkin, juga tidak ada nilai-nilai yang unik, dan dengan demikian tabel akan membutuhkan pencarian sampai akhir untuk N = 1,000,000
akses blok yang tepat . Situasi inilah yang ingin diperbaiki pengindeksan.
Mengingat bahwa catatan indeks hanya berisi bidang yang diindeks dan penunjuk ke catatan asli, masuk akal bahwa itu akan lebih kecil daripada catatan multi-bidang yang ditunjuknya. Jadi indeks itu sendiri membutuhkan lebih sedikit blok disk daripada tabel aslinya, yang karenanya membutuhkan lebih sedikit blok akses untuk beralih melalui. Skema untuk indeks pada bidang firstName diuraikan di bawah ini;
Nama bidang Tipe data Ukuran pada disk
firstName Char (50) 50 byte
(rekam pointer) Spesial 4 byte
Catatan : Pointer di MySQL panjangnya 2, 3, 4 atau 5 byte tergantung pada ukuran tabel.
Contoh 2 - pengindeksan
Diberikan contoh basis data r = 5,000,000
catatan kami dengan panjang catatan indeks R = 54
byte dan menggunakan ukuran B = 1,024
byte blok standar . Faktor pemblokiran indeks adalah bfr = (B/R) = 1024/54 = 18
rekaman per blok disk. Jumlah total blok yang diperlukan untuk menahan indeks adalah N = (r/bfr) = 5000000/18 = 277,778
blok.
Sekarang pencarian menggunakan bidang firstName dapat memanfaatkan indeks untuk meningkatkan kinerja. Ini memungkinkan pencarian indeks biner dengan rata-rata log2 277778 = 18.08 = 19
akses blok. Untuk menemukan alamat catatan yang sebenarnya, yang membutuhkan akses blok lebih lanjut untuk membaca, sehingga total untuk 19 + 1 = 20
blok akses, jauh menangis dari 1.000.000 blok pengaksesan diperlukan untuk menemukan firstName pertandingan dalam tabel non-diindeks.
Kapan itu harus digunakan?
Mengingat bahwa membuat indeks memerlukan ruang disk tambahan (277.778 blok tambahan dari contoh di atas, peningkatan ~ 28%), dan terlalu banyak indeks dapat menyebabkan masalah yang timbul dari batas ukuran sistem file, pemikiran yang cermat harus digunakan untuk memilih yang benar bidang untuk diindeks.
Karena indeks hanya digunakan untuk mempercepat pencarian bidang yang cocok dalam catatan, masuk akal bahwa bidang pengindeksan yang hanya digunakan untuk output hanya akan membuang-buang ruang disk dan waktu pemrosesan saat melakukan operasi penyisipan atau penghapusan, dan dengan demikian harus dihindari. Juga mengingat sifat pencarian biner, kardinalitas atau keunikan data adalah penting. Pengindeksan pada bidang dengan kardinalitas 2 akan membagi data menjadi dua, sedangkan kardinalitas 1.000 akan mengembalikan sekitar 1.000 catatan. Dengan kardinalitas yang rendah, keefektifannya dikurangi menjadi semacam linier, dan pengoptimal kueri akan menghindari penggunaan indeks jika kardinalitas kurang dari 30% dari jumlah catatan, secara efektif membuat indeks menjadi pemborosan ruang.