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

Indeks MySQL - apa praktik terbaiknya?

Anda pasti harus meluangkan waktu untuk membaca tentang pengindeksan, ada banyak hal yang ditulis tentangnya, dan penting untuk memahami apa yang terjadi.

Secara umum, indeks memaksakan pemesanan pada baris tabel.

Demi kesederhanaan, bayangkan sebuah tabel hanyalah file CSV besar. Setiap kali sebuah baris dimasukkan, itu akan disisipkan di akhir . Jadi urutan tabel yang "alami" hanyalah urutan di mana baris dimasukkan.

Bayangkan Anda memiliki file CSV yang dimuat dalam aplikasi spreadsheet yang sangat sederhana. Yang dilakukan spreadsheet ini hanyalah menampilkan data, dan memberi nomor baris secara berurutan.

Sekarang bayangkan Anda perlu menemukan semua baris yang memiliki nilai "M" di kolom ketiga. Mengingat apa yang Anda miliki, Anda hanya memiliki satu pilihan. Anda memindai tabel memeriksa nilai kolom ketiga untuk setiap baris. Jika Anda memiliki banyak baris, metode ini ("pemindaian tabel") dapat memakan waktu lama!

Sekarang bayangkan bahwa selain tabel ini, Anda memiliki file index. Indeks khusus ini adalah indeks nilai di kolom ketiga. Indeks mencantumkan semua nilai dari kolom ketiga, dalam beberapa urutan yang bermakna (misalnya, menurut abjad) dan untuk masing-masing nilai, memberikan daftar nomor baris tempat nilai tersebut muncul.

Sekarang Anda memiliki strategi yang baik untuk menemukan semua baris di mana nilai kolom ketiga adalah "M". Misalnya, Anda dapat melakukan penelusuran biner ! Sedangkan pemindaian tabel mengharuskan Anda untuk melihat N baris (di mana N adalah jumlah baris), pencarian biner hanya mengharuskan Anda melihat entri indeks log-n, dalam kasus terburuk. Wow, itu pasti jauh lebih mudah!

Tentu saja, jika Anda memiliki indeks ini, dan Anda menambahkan baris ke tabel (pada akhirnya, karena begitulah cara kerja tabel konseptual kami), Anda perlu memperbarui indeks setiap saat. Jadi, Anda melakukan sedikit lebih banyak pekerjaan saat menulis baris baru, tetapi Anda menghemat banyak waktu saat menelusuri sesuatu.

Jadi, secara umum, pengindeksan menciptakan tradeoff antara efisiensi baca dan efisiensi tulis. Tanpa indeks, penyisipan bisa sangat cepat -- mesin basis data hanya menambahkan baris ke tabel. Saat Anda menambahkan indeks, mesin harus memperbarui setiap indeks saat melakukan penyisipan.

Di sisi lain, membaca menjadi jauh lebih cepat.

Semoga itu mencakup dua pertanyaan pertama Anda (seperti yang telah dijawab orang lain -- Anda perlu menemukan keseimbangan yang tepat).

Skenario ketiga Anda sedikit lebih rumit. Jika Anda menggunakan LIKE, mesin pengindeks biasanya akan membantu kecepatan baca Anda hingga "%" pertama. Dengan kata lain, jika Anda MEMILIH kolom WHERE LIKE 'foo%bar%', database akan menggunakan indeks untuk menemukan semua baris di mana kolom dimulai dengan "foo", dan kemudian perlu memindai rowset perantara itu untuk menemukan subset yang berisi "batang". SELECT ... WHERE kolom LIKE '%bar%' tidak dapat menggunakan indeks. Saya harap Anda dapat melihat alasannya.

Terakhir, Anda harus mulai memikirkan indeks di lebih dari satu kolom. Konsepnya sama, dan berperilaku mirip dengan hal-hal LIKE -- pada dasarnya, jika Anda memiliki indeks (a,b,c), mesin akan terus menggunakan indeks dari kiri ke kanan sebaik mungkin. Jadi pencarian pada kolom a mungkin menggunakan indeks (a,b,c), seperti yang dilakukan pada (a,b). Namun, mesin perlu melakukan pemindaian tabel lengkap jika Anda mencari WHERE b=5 AND c=1)

Semoga ini membantu menjelaskan sedikit, tetapi saya harus menegaskan kembali bahwa Anda sebaiknya menghabiskan beberapa jam untuk mencari artikel bagus yang menjelaskan hal-hal ini secara mendalam. Ini juga merupakan ide yang baik untuk membaca dokumentasi server database khusus Anda. Cara indeks diterapkan dan digunakan oleh perencana kueri dapat sangat bervariasi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memformat Tanggal &Waktu di MySQL

  2. Bidang integer MySQL dikembalikan sebagai string dalam PHP

  3. Bagaimana cara memeriksa apakah database mysql ada

  4. Memantau Server Percona untuk MySQL - Metrik Utama

  5. Daftar Istilah Database DevOps untuk Pemula MySQL