Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara kerja indeks MySQL?

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 diimplementasikan di lapisan penyimpanan, jadi tidak ada standar di antara mereka dan indeks juga bergantung pada mesin penyimpanan yang Anda gunakan.

InnoDB dan indeks B+Tree

Untuk InnoDB, jenis indeks yang paling umum adalah indeks berbasis B+Tree, yang menyimpan elemen dalam urutan yang diurutkan. Selain itu, Anda tidak perlu mengakses tabel sebenarnya untuk mendapatkan nilai yang diindeks, yang membuat kueri Anda kembali lebih cepat.

"Masalah" tentang jenis indeks ini adalah Anda harus menanyakan nilai paling kiri untuk menggunakan indeks. Jadi, jika indeks Anda memiliki dua kolom, misalnya nama_belakang dan nama_depan, urutan kueri bidang ini sangat penting .

Jadi, diberikan tabel berikut:

CREATE TABLE person (
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    INDEX (last_name, first_name)
);

Kueri ini akan memanfaatkan indeks:

SELECT last_name, first_name FROM person
WHERE last_name = "John" AND first_name LIKE "J%"

Tapi yang berikut ini tidak

SELECT last_name, first_name FROM person WHERE first_name = "Constantine"

Karena Anda menanyakan first_name kolom pertama dan itu bukan kolom paling kiri dalam indeks.

Contoh terakhir ini bahkan lebih buruk:

SELECT last_name, first_name FROM person WHERE first_name LIKE "%Constantine"

Karena sekarang, Anda membandingkan bagian paling kanan dari bidang paling kanan dalam indeks.

Indeks hash

Ini adalah jenis indeks yang berbeda yang sayangnya, hanya mendukung backend memori. Ini sangat cepat tetapi hanya berguna untuk pencarian penuh, yang berarti Anda tidak dapat menggunakannya untuk operasi seperti > , < atau LIKE .

Karena ini hanya berfungsi untuk backend memori, Anda mungkin tidak akan sering menggunakannya. Kasus utama yang dapat saya pikirkan saat ini adalah Anda membuat tabel sementara di memori dengan serangkaian hasil dari pemilihan lain dan melakukan banyak pemilihan lain di tabel sementara ini menggunakan indeks hash.

Jika Anda memiliki VARCHAR besar bidang, Anda dapat "meniru" penggunaan indeks hash saat menggunakan B-Tree, dengan membuat kolom lain dan menyimpan hash dengan nilai besar di atasnya. Katakanlah Anda menyimpan url di bidang dan nilainya cukup besar. Anda juga dapat membuat bidang bilangan bulat yang disebut url_hash dan gunakan fungsi hash seperti CRC32 atau fungsi hash lainnya untuk hash url saat memasukkannya. Dan kemudian, ketika Anda perlu menanyakan nilai ini, Anda dapat melakukan sesuatu seperti ini:

SELECT url FROM url_table WHERE url_hash=CRC32("http://gnu.org");

Masalah dengan contoh di atas adalah karena CRC32 function 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:

SELECT url FROM url_table 
WHERE url_hash=CRC32("http://gnu.org") AND url="http://gnu.org";

Masih layak untuk melakukan hash meskipun jumlah tabrakan tinggi karena Anda hanya akan melakukan perbandingan kedua (string satu) terhadap hash yang berulang.

Sayangnya, dengan menggunakan teknik ini, Anda masih perlu menekan meja untuk membandingkan url lapangan.

Menutup

Beberapa fakta yang dapat Anda pertimbangkan setiap kali Anda ingin berbicara tentang pengoptimalan:

  1. Perbandingan bilangan bulat jauh lebih cepat daripada perbandingan string. Hal ini dapat diilustrasikan dengan contoh tentang emulasi indeks hash di InnoDB .

  2. Mungkin, menambahkan langkah tambahan dalam suatu proses membuatnya lebih cepat, bukan lebih lambat. Hal ini dapat diilustrasikan dengan fakta bahwa Anda dapat mengoptimalkan SELECT dengan membaginya menjadi dua langkah, membuat yang pertama menyimpan nilai di tabel dalam memori yang baru dibuat, lalu mengeksekusi kueri yang lebih berat di tabel kedua ini.

MySQL juga memiliki indeks lain, tetapi saya pikir indeks B+Tree adalah yang paling sering 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 "High Performance MySQL", jawaban di atas pasti berdasarkan bab tentang indeks.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menginstal Percona XtraDB Cluster di CentOS 7

  2. MySQL dengan Node.js

  3. Melarikan diri dari kartu liar MySQL

  4. Cara membuat dan menghapus database dan tabel di MySQL

  5. Bagaimana cara mengonversi epoch ke stempel waktu mySQL di JAVA