MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

Memahami Indeks di MySQL:Bagian Kedua

Pos blog ini adalah bagian kedua dari rangkaian blog tentang indeks di MySQL. Di bagian pertama dari seri posting blog tentang indeks MySQL, kami telah membahas banyak hal, termasuk apa itu, apa yang mereka lakukan, apa tipenya, bagaimana memilih tipe data yang optimal, dan kumpulan karakter MySQL untuk indeks yang Anda gunakan . Kami membahas kelebihan dan kekurangan menggunakan indeks di MySQL; kami memberi tahu Anda cara memilih indeks terbaik untuk digunakan, cara meningkatkan kinerja kueri, dan memastikan MySQL menggunakan indeks Anda, berapa banyak indeks yang harus Anda miliki. Kami juga melalui beberapa pertimbangan terkait dengan mesin penyimpanan. Posting blog ini akan membahas lebih detail mengenai beberapa konten yang telah kita bahas di bagian pertama dari seri ini. Kita akan mulai dengan korelasi antara indeks dan mesin penyimpanan di MySQL.

Indeks dan Mesin Penyimpanan di MySQL

Seperti yang telah kami sebutkan di posting blog sebelumnya, mungkin ada beberapa jenis batasan untuk indeks dan hal-hal lain jika Anda menggunakan mesin penyimpanan tertentu di MySQL. Berikut adalah beberapa di antaranya - sekarang kita akan mendefinisikan apa beberapa di antaranya (beberapa di antaranya telah dibahas di bagian pertama dari seri blog jadi jika kita kehilangan sesuatu, itu mungkin ada di sana), kemudian membahasnya dengan lebih mendalam. analisis:

  • Sesuai dengan dokumentasi MySQL, jumlah maksimum indeks, panjang kunci maksimum, dan panjang indeks maksimum adalah ditentukan per mesin penyimpanan. Seperti yang telah kami sebutkan di posting blog sebelumnya, jumlah maksimum indeks per tabel MyISAM dan InnoDB adalah 64, jumlah maksimum kolom per indeks di kedua mesin penyimpanan adalah 16, panjang kunci maksimum untuk InnoDB adalah 3500 byte dan maksimum panjang kunci untuk MyISAM adalah 1000 byte.

  • Anda tidak dapat menggunakan CREATE INDEX untuk membuat PRIMARY KEY - gunakan ALTER TABLE sebagai gantinya.

  • Kolom BLOB dan TEXT hanya dapat diindeks untuk tabel yang menjalankan mesin penyimpanan InnoDB, MyISAM, dan BLACKHOLE.

  • Jika Anda hanya mengindeks awalan kolom, perlu diingat bahwa dukungan awalan dan panjangnya juga tergantung pada mesin penyimpanan. Awalan dapat memiliki panjang hingga 767 byte untuk tabel InnoDB yang menggunakan format baris REDUNDANT atau COMPACT, tetapi untuk format baris DYNAMIC atau COMPRESSED, batas panjang awalan ditingkatkan menjadi 3072 byte. Untuk tabel MyISAM, batas panjang awalan adalah 1000 byte. Mesin penyimpanan NDB tidak mendukung awalan sama sekali.

  • Jika mode SQL ketat diaktifkan dan awalan indeks melebihi ukuran tipe data kolom maksimum, CREATE INDEX melempar sebuah kesalahan. Jika mode SQL ketat tidak diaktifkan, CREATE INDEX menghasilkan peringatan. Jika INDEKS UNIK dibuat, terjadi kesalahan.

  • Secara umum, MySQL hanya mengizinkan Anda membuat hingga 16 indeks pada tabel tertentu.

  • Jika Anda menggunakan indeks PRIMARY KEY, Anda hanya dapat memiliki satu kunci utama per tabel. FULLTEXT, UNIQUE INDEX, dan INDEX tidak memiliki batasan ini.

  •  Jika Anda menggunakan indeks FULLTEXT, ingatlah bahwa indeks tersebut hanya dapat digunakan untuk mesin penyimpanan InnoDB atau MyISAM dan untuk kolom CHAR, VARCHAR atau TEXT. Juga perlu diingat bahwa MySQL hanya menggunakan indeks FULLTEXT ketika klausa MATCH() AGAINST() digunakan dan bahwa Anda sebenarnya dapat memiliki indeks dan indeks teks lengkap pada kolom yang sama pada saat yang sama jika Anda menginginkannya dan bahwa indeks FULLTEXT memilikinya kumpulan stopword masing-masing khusus untuk mesin penyimpanan yang digunakan.

  • Indeks B-Tree mungkin berguna jika Anda menggunakan kueri LIKE yang dimulai dengan karakter pengganti, tetapi hanya di tempat tertentu skenario.

Mengetahui batasan indeks ini terbukti bermanfaat jika Anda mencoba memahami cara kerja indeks di MySQL. Yang lebih penting untuk dipahami adalah kenyataan bahwa Anda harus memverifikasi bahwa indeks Anda benar-benar digunakan oleh MySQL. Kami telah menyentuhnya secara singkat di bagian pertama dari seri ini ("Cara Memilih Indeks Terbaik untuk Digunakan?"), Tetapi kami belum memberi tahu Anda cara memverifikasi bahwa indeks Anda benar-benar digunakan oleh MySQL. Untuk melakukannya, verifikasi penggunaannya dengan menggunakan EXPLAIN - ketika EXPLAIN digunakan bersama dengan pernyataan yang dapat dijelaskan, MySQL menampilkan informasi dari pengoptimal tentang rencana eksekusi pernyataan.

Pertimbangan KUNCI UTAMA

Beberapa pertimbangan dasar yang berkaitan dengan indeks PRIMARY KEY di MySQL mencakup fakta bahwa indeks tersebut terutama digunakan untuk mengidentifikasi catatan secara unik dalam sebuah tabel dan sering digunakan dengan nilai AUTO_INCREMENTing yang berarti bahwa mereka dapat sangat berguna jika Anda membuat, katakanlah, bidang ID. Bidang PRIMARY KEY harus berisi nilai unik dan tidak boleh berisi nilai NULL.

Mencocokkan Awalan Kolom

Indeks juga dapat cocok dengan awalan kolom. Pendekatan indeks ini dapat berguna jika kolom Anda adalah kolom string dan menurut Anda menambahkan indeks di seluruh kolom berpotensi menghabiskan banyak ruang disk. Indeks Anda dapat cocok dengan awalan kolom seperti ini:

ALTER TABLE demo_table ADD INDEX index_name(column_name(length));

Kueri di atas akan menambahkan nama_indeks indeks pada kolom bernama nama_kolom hanya untuk awalan kolom yang ditentukan. Untuk memilih jumlah panjang yang baik untuk diindeks, pastikan bahwa penggunaan awalan Anda memaksimalkan keunikan nilai dalam kolom:temukan jumlah baris dalam tabel dan evaluasi panjang awalan yang berbeda hingga Anda mencapai keunikan baris yang diinginkan.

Indeks FULLTEXT di MySQL

Indeks FULLTEXT di MySQL sama sekali berbeda. Mereka memiliki banyak keterbatasan yang unik untuk diri mereka sendiri (misalnya, InnoDB memiliki daftar stopword yang terdiri dari 36 kata sementara daftar stopword MyISAM terdiri dari 143 kata), mereka juga memiliki mode pencarian yang unik. Beberapa di antaranya termasuk mode bahasa alami (untuk mengaktifkan mode pencarian seperti itu, jalankan permintaan pencarian FULLTEXT tanpa pengubah), Anda juga dapat memperluas pencarian Anda (untuk melakukannya, gunakan pengubah WITH QUERY EXPANSION - mode pencarian seperti itu melakukan pencarian dua kali, tetapi ketika pencarian berjalan untuk kedua kalinya itu mencakup beberapa catatan paling relevan dari pencarian pertama - sering digunakan ketika pengguna memiliki pengetahuan tersirat tentang sesuatu), untuk mencari dengan operator boolean gunakan pengubah IN BOOLEAN MODE. Indeks FULLTEXT juga hanya akan digunakan jika permintaan pencarian terdiri dari minimal tiga karakter untuk InnoDB dan minimal empat karakter untuk MyISAM.

Menggunakan Indeks B-Tree dengan Wildcard

Indeks juga sering digunakan jika Anda membuat sesuatu yang mirip dengan mesin telusur. Untuk itu, Anda sering kali hanya ingin mencari sebagian dari suatu nilai dan mengembalikan hasilnya - di sinilah peran wildcard. Kueri sederhana menggunakan wildcard menggunakan kueri LIKE dan tanda % untuk menandakan "apa pun" setelah teks. Misalnya, kueri seperti itu akan menelusuri hasil yang diawali dengan kata "pencarian" dan diikuti apa pun setelahnya:

SELECT * FROM … WHERE demo_column LIKE ‘search%’;

Kueri seperti itu akan menelusuri hasil yang dimulai dengan apa saja, dengan kata "search" dan setelahnya:

SELECT * FROM … WHERE demo_column LIKE ‘%search%’;

Tapi ini masalahnya - kueri di atas tidak akan menggunakan indeks. Mengapa? Karena memiliki wildcard di awal dan MySQL tidak dapat mengetahui apa yang dibutuhkan kolom untuk memulai. Itulah mengapa kami mengatakan bahwa indeks karakter pengganti memiliki tempatnya, tetapi hanya dalam skenario tertentu - yaitu, skenario di mana Anda tidak memiliki karakter pengganti di awal kueri penelusuran Anda.

Menggunakan ClusterControl untuk Memantau Kinerja Kueri

Selain menggunakan EXPLAIN, Anda juga dapat menggunakan ClusterControl untuk memantau kinerja kueri Anda:ClusterControl menyediakan serangkaian fitur pemantauan dan pelaporan lanjutan yang memungkinkan Anda melacak kinerja instans dan kueri database Anda . Misalnya, klik pada sebuah cluster dan Anda akan melihat tab "Query Monitor". Klik di atasnya dan ClusterControl akan membiarkan Anda mengamati status kueri Anda di instance database Anda:

Bagian dari ClusterControl ini memungkinkan Anda melihat daftar top slow dan long- menjalankan kueri sambil juga memungkinkan Anda memfilternya. Misalnya jika Anda tahu bahwa belum lama ini Anda menjalankan kueri yang terdiri dari @@log_bin, Anda cukup mencari istilah tersebut dan ClusterControl akan mengembalikan daftar hasil:

Seperti yang mungkin Anda perhatikan, Anda juga dapat memfilter kueri menurut host yang Anda gunakan atau dengan kemunculan, Anda juga dapat memilih untuk melihat sekumpulan baris, misalnya, 20, 100, atau 200. ClusterControl juga akan memberi tahu Anda kapan kueri terakhir terlihat, berapa total waktu eksekusinya, berapa banyak baris yang dikembalikan, berapa banyak baris yang diperiksa dan seterusnya. ClusterControl terbukti berperan jika Anda ingin mengamati bagaimana indeks Anda sebenarnya digunakan oleh instans MySQL, MariaDB, MongoDB, PostgreSQL, atau TimescaleDB.

Ringkasan

Dalam posting blog ini kami membahas beberapa batasan dan manfaat terkait indeks di MySQL dan kami juga telah membahas bagaimana ClusterControl dapat membantu Anda mencapai sasaran kinerja basis data Anda. Kami juga akan memiliki bagian ketiga tentang indeks di MySQL menyelam lebih dalam ke dalamnya, tetapi untuk menyimpulkan apa yang telah kami bahas sejauh ini, perlu diingat bahwa indeks di MySQL tentu memiliki tempat mereka sendiri - untuk membuat yang terbaik dari mereka, tahu bagaimana mereka berinteraksi dengan mesin penyimpanan, manfaat dan batasannya, bagaimana dan kapan menggunakan jenis indeks tertentu dan memilih dengan bijak.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana COLLATION() Bekerja di MariaDB

  2. Rilis AX MariaDB Baru Menampilkan MariaDB ColumnStore 1.1.3 GA

  3. Mengamankan Cadangan MySQL:Panduan

  4. Tips untuk Memantau Replikasi MariaDB dengan ClusterControl

  5. Cara Menginstal Lighttpd dengan PHP, MariaDB dan PhpMyAdmin di Ubuntu