Saya benar-benar tertarik dengan cara kerja indeks MySQL, lebih khusus lagi, bagaimana mereka mengembalikan data yang diminta tanpa memindai seluruh tabel?
Itu di luar topik, saya tahu, tetapi jika ada seseorang yang bisa menjelaskan hal ini kepada saya secara terperinci, saya akan sangat, sangat berterima kasih.
SELECT * FROM members WHERE id = '1'
- jadi mengapa dengan indeks berfungsi lebih cepat? Apa yang dilakukan indeks di sini?Jawaban:
Pada dasarnya indeks di atas meja berfungsi seperti indeks dalam sebuah buku (dari situlah nama itu berasal):
Katakanlah Anda memiliki buku tentang basis data dan Anda ingin mencari beberapa informasi tentang, katakanlah, penyimpanan. Tanpa indeks (dengan asumsi tidak ada bantuan lain, seperti daftar isi) Anda harus melewati halaman satu per satu, sampai Anda menemukan topik (itu a
full table scan
). Di sisi lain, indeks memiliki daftar kata kunci, sehingga Anda akan berkonsultasi dengan indeks dan melihat yangstorage
disebutkan pada halaman 113-120.231 dan 354. Kemudian Anda dapat membalik ke halaman tersebut secara langsung, tanpa mencari (itu pencarian dengan indeks, agak lebih cepat).Tentu saja, seberapa berguna indeks itu, tergantung pada banyak hal - beberapa contoh, menggunakan perumpamaan di atas:
sumber
Hal pertama yang harus Anda ketahui adalah bahwa indeks adalah cara untuk menghindari pemindaian tabel lengkap untuk mendapatkan hasil yang Anda cari.
Ada berbagai jenis indeks dan mereka diterapkan di lapisan penyimpanan, jadi tidak ada standar di antara mereka dan mereka juga bergantung pada mesin penyimpanan yang Anda gunakan.
InnoDB dan indeks B + Tree
Untuk InnoDB, tipe indeks yang paling umum adalah indeks berbasis B + Tree, yang menyimpan elemen dalam urutan diurutkan. Selain itu, Anda tidak harus mengakses tabel sebenarnya untuk mendapatkan nilai yang diindeks, yang membuat kueri Anda kembali dengan cara yang lebih cepat.
"Masalah" tentang tipe indeks ini adalah Anda harus meminta nilai paling kiri untuk menggunakan indeks. Jadi, jika indeks Anda memiliki dua kolom, ucapkan last_name dan first_name, urutan yang Anda query bidang ini sangat penting .
Jadi, diberikan tabel berikut:
Kueri ini akan memanfaatkan indeks:
Tapi yang berikut tidak mau
Karena Anda menanyakan
first_name
kolom terlebih dahulu dan itu bukan kolom paling kiri dalam indeks.Contoh terakhir ini bahkan lebih buruk:
Karena sekarang, Anda membandingkan bagian paling kanan dari bidang paling kanan dalam indeks.
Indeks hash
Ini adalah tipe indeks berbeda yang sayangnya, hanya dukungan backend memori. Ini kilat cepat tetapi hanya berguna untuk pencarian penuh, yang berarti Anda tidak dapat menggunakannya untuk operasi seperti
>
,<
atauLIKE
.Karena ini hanya berfungsi untuk backend memori, Anda mungkin tidak akan sering menggunakannya. Kasus utama yang dapat saya pikirkan saat ini adalah yang Anda buat tabel sementara di memori dengan satu set hasil dari pilih lain dan melakukan banyak pilihan lain dalam tabel sementara ini menggunakan indeks hash.
Jika Anda memiliki
VARCHAR
bidang besar , Anda dapat "meniru" penggunaan indeks hash saat menggunakan B-Tree, dengan membuat kolom lain dan menyimpan hash dari nilai besar di atasnya. Katakanlah Anda menyimpan url di bidang dan nilainya cukup besar. Anda juga bisa membuat bidang bilangan bulat yang disebuturl_hash
dan menggunakan fungsi hash sepertiCRC32
atau fungsi hash lainnya untuk meng-hash url saat memasukkannya. Dan kemudian, ketika Anda perlu menanyakan nilai ini, Anda bisa melakukan sesuatu seperti ini:Masalah dengan contoh di atas adalah bahwa karena
CRC32
fungsi menghasilkan hash yang cukup kecil, Anda akan berakhir dengan banyak tabrakan dalam nilai hash. Jika Anda membutuhkan nilai yang tepat, Anda dapat memperbaiki masalah ini dengan melakukan hal berikut:Ini masih layak untuk hash hal bahkan jika angka tumbukan tinggi karena Anda hanya akan melakukan perbandingan kedua (string satu) terhadap hash yang diulang.
Sayangnya, menggunakan teknik ini, Anda masih perlu menekan tabel untuk membandingkan
url
bidang.Bungkus
Beberapa fakta yang dapat Anda pertimbangkan setiap kali Anda ingin berbicara tentang pengoptimalan:
Perbandingan integer jauh lebih cepat daripada perbandingan string. Ini dapat diilustrasikan dengan contoh tentang persaingan indeks hash di
InnoDB
.Mungkin, menambahkan langkah-langkah tambahan dalam suatu proses membuatnya lebih cepat, bukan lebih lambat. Itu dapat diilustrasikan oleh fakta bahwa Anda dapat mengoptimalkan a
SELECT
dengan membaginya menjadi dua langkah, membuat yang pertama menyimpan nilai dalam tabel di-memori yang baru dibuat, dan kemudian menjalankan kueri yang lebih berat di tabel kedua ini.MySQL memiliki indeks lain juga, tapi saya pikir B + Tree adalah yang paling banyak digunakan dan hash adalah hal yang baik untuk diketahui, tetapi Anda dapat menemukan yang lain di dokumentasi MySQL .
Saya sangat menyarankan Anda untuk membaca buku "MySQL Kinerja Tinggi", jawaban di atas pasti didasarkan pada bab tentang indeks.
sumber
SELECT last_name, first_name FROM person WHERE last_name= "Constantine"
2.SELECT last_name, first_name FROM person WHERE last_name LIKE "%Constantine"
Pada dasarnya indeks adalah peta dari semua kunci Anda yang diurutkan secara berurutan. Dengan daftar secara berurutan, maka alih-alih memeriksa setiap kunci, ia dapat melakukan sesuatu seperti ini:
1: Masuk ke tengah daftar - lebih tinggi atau lebih rendah dari yang saya cari?
2: Jika lebih tinggi, pergi ke titik setengah antara tengah dan bawah, jika lebih rendah, tengah dan atas
3: Apakah lebih tinggi atau lebih rendah? Lompat ke titik tengah lagi, dll.
Dengan menggunakan logika itu, Anda dapat menemukan elemen dalam daftar yang diurutkan dalam sekitar 7 langkah, alih-alih memeriksa setiap item.
Jelas ada kompleksitas, tetapi itu memberi Anda ide dasar.
sumber
Lihatlah tautan ini: http://dev.mysql.com/doc/refman/5.0/id/mysql-indexes.html
Cara kerjanya terlalu luas untuk dibahas dalam satu pos SO.
Berikut adalah salah satu penjelasan terbaik dari indeks yang saya lihat. Sayangnya itu untuk SQL Server dan bukan MySQL. Saya tidak yakin seberapa mirip keduanya ...
sumber
Lihat video ini untuk detail lebih lanjut tentang Pengindeksan
Pengindeksan Sederhana Anda dapat membuat indeks unik di atas meja. Indeks unik berarti bahwa dua baris tidak dapat memiliki nilai indeks yang sama. Berikut adalah sintaks untuk membuat Indeks di atas meja
Anda dapat menggunakan satu atau beberapa kolom untuk membuat indeks. Misalnya, kita dapat membuat indeks
tutorials_tbl
menggunakan tutorial_author.Anda dapat membuat indeks sederhana di atas sebuah tabel. Hapus saja kata kunci UNIK dari kueri untuk membuat indeks sederhana. Indeks sederhana memungkinkan nilai duplikat dalam sebuah tabel.
Jika Anda ingin mengindeks nilai dalam kolom dalam urutan menurun, Anda bisa menambahkan kata DESC yang dicadangkan setelah nama kolom.
sumber
Saya ingin menambahkan 2 sen saya. Saya jauh dari menjadi ahli basis data, tetapi saya baru saja membaca sedikit tentang topik ini; cukup bagi saya untuk mencoba dan memberikan ELI5. Jadi, inilah penjelasan awam.
Saya memahaminya sehingga indeks seperti cermin mini dari meja Anda, seperti array asosiatif. Jika Anda memberi makan dengan kunci yang cocok maka Anda bisa langsung melompat ke baris itu dalam satu "perintah".
Tetapi jika Anda tidak memiliki indeks / array itu, penerjemah kueri harus menggunakan for-loop untuk melewati semua baris dan memeriksa kecocokan (pemindaian tabel penuh).
Memiliki indeks memiliki "sisi buruk" penyimpanan tambahan (untuk mini-mirror itu), dengan imbalan "sisi positif" dari mencari konten lebih cepat.
Perhatikan bahwa (bergantung pada mesin db Anda) membuat kunci primer, asing atau unik secara otomatis mengatur indeks masing-masing. Prinsip yang sama itu pada dasarnya adalah mengapa dan bagaimana kunci-kunci itu bekerja.
sumber
Menambahkan beberapa representasi visual ke daftar jawaban.
MySQL menggunakan lapisan tipuan tambahan: catatan indeks sekunder menunjuk ke catatan indeks primer, dan indeks primer itu sendiri menyimpan lokasi baris pada disk. Jika baris mengimbangi perubahan, hanya indeks utama yang perlu diperbarui.
Peringatan: Struktur data disk terlihat datar dalam diagram tetapi sebenarnya adalah pohon B +.
Sumber: tautan
sumber
Di MySQL InnoDB, ada dua jenis indeks.
Kunci utama yang disebut indeks berkerumun. Kata kunci indeks disimpan dengan data rekam nyata dalam simpul daun Pohon B +.
Kunci sekunder yang merupakan indeks non clustered. Indeks ini hanya menyimpan kata-kata kunci kunci utama bersama dengan kata-kata kunci indeks mereka sendiri dalam B + Tree leaf node. Jadi ketika mencari dari indeks sekunder, pertama-tama akan menemukan kata kunci indeks kunci utama dan memindai kunci utama B + Tree untuk menemukan catatan data nyata. Ini akan membuat indeks sekunder lebih lambat dibandingkan dengan pencarian indeks primer. Namun, jika semua
select
kolom dalam indeks sekunder, maka tidak perlu mencari indeks primer B + Tree lagi. Ini disebut indeks penutup.sumber