Rumah >pangkalan data >tutorial mysql >Apakah kelebihan dan kekurangan indeks berkelompok MySQL
Indeks pangkalan data boleh dibahagikan kepada jenis yang berbeza dari perspektif yang berbeza, dan indeks berkelompok adalah salah satu daripadanya.
Indeks berkelompok dalam bahasa Inggeris ialah Indeks Berkelompok Kadangkala anda mungkin melihat sesetengah orang merujuknya sebagai indeks berkelompok, dll. Sebaliknya ialah indeks bukan berkelompok atau indeks sekunder.
Indeks berkelompok bukan jenis indeks yang berasingan, tetapi cara menyimpan data. Dalam enjin storan InnoDB MySQL, indeks berkelompok yang dipanggil sebenarnya menyimpan indeks dan baris data dalam B+Tree yang sama: Pada masa ini, data diletakkan dalam nod daun, berkelompok, bermakna Maksudnya, baris data dan nilai kunci yang sepadan wujud bersama-sama.
Andaikan saya mempunyai data berikut:
id(主键) | username | age | address | gender |
---|---|---|---|---|
1 | ab | 99 | 深圳 | 男 |
2 | ac | 98 | 广州 | 男 |
3 | af | 88 | 北京 | 女 |
4 | bc | 80 | 上海 | 女 |
5 | bg | 85 | 重庆 | 女 |
6 | bw | 95 | 天津 | 男 |
7 | bw | 99 | 海口 | 女 |
8 | cc | 92 | 武汉 | 男 |
9 | ck | 90 | 深圳 | 男 |
10 | cx | 93 | 深圳 | 男 |
Kemudian indeks berkelompoknya mungkin kelihatan seperti ini:
Kemudian anda boleh melihat bahawa terdapat kedua-dua nilai kunci utama (indeks) dan baris data pada daun. Terdapat hanya nilai kunci utama (indeks) pada nod.
Rakan-rakan, fikir-fikirkan, data dalam jadual MySQL hanya boleh disimpan dalam satu salinan pada cakera, dan adalah mustahil untuk menyimpan dua salinan Oleh itu, dalam jadual, hanya boleh ada satu kelompok indeks, dan adalah mustahil untuk mempunyai satu.
Sesetengah rakan keliru tentang hubungan antara keduanya, malah menyamakan kedua-duanya.
Dalam sesetengah pangkalan data, pembangun dibenarkan untuk bebas memilih indeks mana yang hendak digunakan sebagai indeks berkelompok, tetapi MySQL tidak menyokong ciri ini.
Dalam MySQL, jika jadual itu sendiri mempunyai set kunci utama, maka kunci utama ialah indeks berkelompok jika jadual itu sendiri tidak mempunyai set kunci utama, indeks unik dan tidak kosong dalam jadual akan dipilih sebagai indeks berkelompok ; Jika tiada indeks bukan kosong yang unik dalam jadual, kunci utama tersirat dalam jadual akan dipilih secara automatik sebagai indeks berkelompok. Brother Song akan memperkenalkan anda kepada kunci utama tersirat jadual MySQL dalam artikel akan datang.
Walau bagaimanapun, secara amnya, adalah disyorkan agar anda menetapkan sendiri kunci utama untuk jadual, kerana kunci utama tersirat dinaikkan secara automatik dan terdapat masalah dengan kenaikan automatik: auto -nilai kenaikan akan menjadi sangat tinggi Untuk isu persaingan kunci, sempadan atas kunci utama dipanggil data panas Kerana semua operasi sisipan memerlukan kunci utama ditambah dan tidak boleh diulang, persaingan kunci akan berlaku dan prestasi akan berkurangan.
Menurut pengenalan di atas, kita boleh merumuskan hubungan antara indeks berkelompok dan indeks kunci utama dalam MySQL seperti berikut:
Indeks berkelompok tidak semestinya indeks kunci utama.
Indeks kunci utama mestilah indeks berkelompok.
Mula-mula mari kita bincangkan tentang kelebihan:
Kita boleh menggabungkan data saling berkaitan Keep ia bersama-sama. Sebagai contoh, terdapat jadual pesanan pengguna Kami boleh mengagregatkan semua data berdasarkan ID Pengguna + ID Pesanan boleh diulang, tetapi ID pesanan tidak akan diulang data pesanan yang berkaitan dengan pengguna Semuanya disimpan bersama-sama Jika anda perlu menanyakan semua pesanan pengguna, ia akan menjadi sangat pantas dan hanya memerlukan sedikit IO cakera.
Tidak perlu memulangkan jadual, jadi akses data lebih cepat. Dalam indeks berkelompok, indeks dan data berada pada B+Tree yang sama, jadi mendapatkan data daripada indeks berkelompok adalah lebih cepat daripada mendapatkan data daripada indeks tidak berkelompok (indeks tidak berkelompok memerlukan sandaran jadual).
Untuk kes pertama, jika kita ingin menanyakan semua ID pesanan pengguna ini berdasarkan ID pengguna, maka tidak perlu pergi ke nod daun pada masa ini, kerana nod sokongan Terdapat data yang kita perlukan, jadi kita boleh terus menggunakan ciri-ciri indeks penutup untuk membaca data yang diperlukan.
Ini adalah beberapa kelebihan biasa indeks berkelompok Malah, kita harus menggunakan sepenuhnya kelebihan ini dalam reka bentuk jadual harian.
Mari kita lihat keburukan:
Rakan-rakan saya mendapati bahawa kelebihan indeks berkelompok yang kami nyatakan sebelum ini adalah terutamanya indeks berkelompok mengurangkan bilangan IO , dengan itu meningkatkan Prestasi pangkalan data, tetapi beberapa aplikasi intensif IO secara langsung boleh memuatkan memori yang cukup besar untuk membaca semua data ke dalam memori untuk operasi Dalam kes ini, indeks berkelompok tidak mempunyai kelebihan.
Kunci primer rawak akan menyebabkan masalah pemisahan halaman Jika kunci utama dimasukkan secara berurutan, ia akan menjadi lebih cekap, kerana dalam B+Tree, anda hanya perlu menambahkannya pada bahagian. belakang; tetapi kunci utama Jika ia adalah sisipan tidak berurutan, kecekapan akan menjadi lebih rendah kerana pemisahan halaman mungkin terlibat. Mengambil gambar di atas sebagai contoh, dengan mengandaikan bahawa setiap nod boleh menyimpan tiga keping data, dan sekarang kita ingin memasukkan rekod dengan kunci utama 4.5, maka kita perlu mengalihkan nilai kunci utama 5 kembali, yang mana akan menyebabkan nod dengan kunci utama 8 juga Bergerak kembali. Pemisahan halaman menghasilkan pemasukan data yang kurang cekap dan menggunakan lebih banyak ruang storan.
Apabila menanyakan indeks bukan berkelompok (indeks sekunder), anda perlu mengembalikan jadual. Oleh kerana indeks ialah pepohon indeks dan semua data berada pada indeks berkelompok, jadi jika anda menggunakan indeks bukan berkelompok untuk mencari, daun indeks bukan berkelompok menyimpan nilai kunci utama Cari nilai kunci primer terlebih dahulu , dan kemudian tahan Nilai kunci utama kemudiannya dicari pada indeks berkelompok, supaya sejumlah dua pokok indeks disoal, iaitu pulangan jadual.
Atas ialah kandungan terperinci Apakah kelebihan dan kekurangan indeks berkelompok MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!