Ikhtisar Apa itu indeks tunggal dan apa itu indeks komposit? Kapan harus membuat indeks komposit baru, dan apa yang harus saya perhatikan dalam indeks komposit? Artikel ini terutama merupakan ringkasan dari beberapa diskusi di Internet.
Satu. Konsep
Indeks tunggal adalah situasi di mana indeks tercantum dalam satu kolom, yaitu pernyataan pembuatan indeks baru diimplementasikan hanya pada satu kolom.
Pengguna dapat membuat indeks pada beberapa kolom, yang disebut indeks komposit (indeks gabungan). Indeks komposit dibuat dengan cara yang persis sama seperti indeks tunggal. Tetapi indeks komposit memerlukan lebih sedikit overhead selama operasi database dan dapat menggantikan beberapa indeks tunggal. Ketika jumlah baris dalam tabel jauh lebih besar daripada jumlah kunci, metode ini dapat secara signifikan mempercepat kecepatan kueri tabel.
Ada dua konsep pada saat yang sama, indeks sempit dan indeks lebar, indeks sempit mengacu pada indeks dengan 1-2 kolom, dan umumnya mengacu pada indeks tunggal kecuali ditentukan lain. Indeks lebar adalah indeks dengan lebih dari 2 kolom.
Prinsip penting dari desain indeks adalah menggunakan indeks sempit alih-alih indeks lebar, karena indeks sempit cenderung lebih efektif daripada indeks gabungan. Memiliki indeks yang lebih sempit akan memberi pengoptimal lebih banyak pilihan, yang seringkali membantu meningkatkan kinerja.
Dua. penggunaan
Membuat indeks Buat indeks IDX1 pada tabel1(col1,col2,col3) Tanya pilih * dari tabel1 di mana col1= A dan col2= B dan col3 = C
Saat ini, pengoptimal kueri tidak memindai tabel, tetapi langsung mengambil data dari indeks, karena ada data ini dalam indeks, yang disebut kueri overlay, dan kecepatan kueri sangat cepat.
Tiga. Catatan:
1. Kapan harus menggunakan indeks majemuk Dalam kondisi where, bidang diindeks, dan jika beberapa bidang digunakan, indeks komposit digunakan. Umumnya, jangan membuat indeks apa pun di bidang select (jika Anda ingin mengkueri select col1, col2, col3 dari mytable, Anda tidak memerlukan indeks di atas). Pengindeksan berdasarkan kondisi di mana adalah prinsip yang sangat penting. Berhati-hatilah untuk tidak menggunakan terlalu banyak indeks, jika tidak maka akan berdampak besar pada efisiensi pembaruan tabel, karena Anda harus menghabiskan banyak waktu untuk membuat indeks saat mengoperasikan tabel.
2. Untuk indeks komposit, saat menggunakan kueri, yang terbaik adalah mengikuti urutan menemukan indeks, yang paling efisien. Sebagai contoh: IDX1: buat indeks idx1 pada tabel1(col2,col3,col5) pilih * dari tabel1 di mana col2=A dan col3=B dan col5=D
Jika itu adalah "pilih * dari tabel1 di mana col3=B dan col2=A dan col5=D" Atau "pilih * dari tabel1 di mana col3=B" tidak akan menggunakan indeks, atau efeknya tidak terlihat
3. Akankah indeks komposit menggantikan indeks tunggal? Banyak orang berpikir bahwa menambahkan bidang apa pun ke indeks berkluster dapat meningkatkan kecepatan kueri, tetapi beberapa orang bingung: Jika bidang indeks berkluster majemuk dikueri secara terpisah, apakah kecepatan kueri akan diperlambat? Dengan pertanyaan ini, mari kita lihat kecepatan kueri berikut (kumpulan hasilnya adalah 250.000 buah data) :( kolom tanggal fariqi menempati peringkat pertama di kolom awal indeks agregasi komposit, dan nama pengguna neibuyonghu menempati urutan kedua)
IDX1:create index idx1 on Tgongwen(fariqi,neibuyonghu)
(1) pilih gid, fariqi, neibuyonghu, judul dari Tgongwen Tempat Fariqi>'2004-5-5'
Kecepatan kueri: 2513 ms
(2) pilih gid, fariqi, neibuyonghu, judul dari Tgongwen di mana fariqi>'2004-5-5' dan neibuyonghu='kantor'
Kecepatan kueri: 2516 ms
(3) pilih gid, fariqi, neibuyonghu, judul dari Tgongwen di mana neibuyonghu='kantor'
Kecepatan kueri: 60280 milidetik
Dari eksperimen di atas, kita dapat melihat bahwa jika hanya kolom awal indeks berkluster yang digunakan sebagai kondisi kueri, kecepatan kueri semua kolom dengan indeks berkluster komposit hampir sama, bahkan sedikit lebih cepat daripada menggunakan semua kolom indeks komposit (ketika jumlah kumpulan hasil kueri sama). Jika hanya kolom non-awal dari indeks agregat majemuk yang digunakan sebagai kondisi kueri, indeks ini tidak akan melakukan apa pun. Tentu saja, kecepatan kueri pernyataan 1 dan 2 sama karena jumlah entri dalam kueri sama, jika semua kolom indeks komposit digunakan, dan hasil kueri sedikit, ini akan membentuk "penggantian indeks", sehingga performa dapat dioptimalkan. Selain itu, perlu diingat bahwa apakah Anda sering menggunakan kolom lain dalam indeks agregat atau tidak, kolom utama harus menjadi kolom yang paling sering digunakan.
[Ref: Skema Algoritma Pengoptimalan Kueri dan Penomoran Halaman http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]
4. Apakah saya perlu membuat indeks tunggal dan indeks komposit pada kolom yang sama secara bersamaan? Eksperimen: Sysbase 5.0 tabel tabel1 bidang: col1, col2, col3
Langkah-langkah pengujian: (1) Buat indeks idx1 pada col1 Jalankan select * dari table1 di mana col1=A menggunakan idx1 Jalankan select * dari table1 di mana col1=A dan col2=B juga menggunakan idx1
(2) Hapus indeks idx1, lalu buat idx2 pada indeks komposit (col1,col2) Kedua kueri menggunakan idx2
(3) Jika kedua indeks idx1 dan idx2 ada Bukan di mana col1='A' menggunakan idx1; di mana col1=A dan col2=B menggunakan idx2. Pengoptimal kuerinya menggunakan salah satu indeks yang umum digunakan sebelumnya. Gunakan idx1 atau idx2.
Dapat dilihat bahwa (1) Untuk tabel, jika ada indeks majemuk pada (col1, col2), tidak perlu membuat indeks tunggal pada col1 secara bersamaan. (2) Jika kondisi kueri memerlukannya, Anda dapat menambahkan indeks majemuk pada (col1, col2) ketika sudah ada indeks tunggal pada col1, yang dapat meningkatkan efisiensi sampai batas tertentu. (3) Tidak ada banyak manfaat dalam membangun indeks komposit dengan beberapa bidang (berisi 5 atau 6 bidang) pada saat yang sama, secara relatif, membangun indeks dengan beberapa bidang sempit (hanya berisi satu, atau paling banyak 2 bidang) dapat mencapai efisiensi dan fleksibilitas yang lebih baik.
5. Apakah saya perlu menutupi kueri? Umumnya yang terbaik adalah tidak menggunakan strategi yang menekankan cakupan kueri penuh. Jika semua kolom dalam klausa Select ditimpa oleh indeks non-kluster, pengoptimal akan mengenali ini dan memberikan performa yang baik. Namun, hal ini sering menghasilkan indeks yang terlalu luas dan terlalu bergantung pada kemungkinan pengoptimal menggunakan kebijakan tersebut. Biasanya, indeks sempit digunakan untuk jumlah kueri yang lebih besar, yang memberikan performa yang lebih baik untuk kueri besar. |