Performa kueri profil di Azure Database for MySQL - Server Fleksibel dengan menggunakan EXPLAIN
BERLAKU UNTUK: Azure Database for MySQL - Server Tunggal Azure Database for MySQL - Server Fleksibel
Penting
Server tunggal Azure Database for MySQL berada di jalur penghentian. Kami sangat menyarankan Agar Anda meningkatkan ke server fleksibel Azure Database for MySQL. Untuk informasi selengkapnya tentang migrasi ke server fleksibel Azure Database for MySQL, lihat Apa yang terjadi pada Server Tunggal Azure Database for MySQL?
EXPLAIN adalah alat berguna yang dapat membantu Anda mengoptimalkan kueri. Anda dapat menggunakan pernyataan EXPLAIN untuk mendapatkan informasi tentang bagaimana pernyataan SQL dijalankan. Berikut ini menunjukkan contoh output dari menjalankan pernyataan EXPLAIN.
mysql> EXPLAIN SELECT * FROM tb1 WHERE id=100\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 995789
filtered: 10.00
Extra: Using where
Dalam contoh ini, nilai kunci adalah NULL, yang berarti bahwa server fleksibel Azure Database for MySQL tidak dapat menemukan indeks apa pun yang dioptimalkan untuk kueri. Akibatnya, ia melakukan pemindaian tabel penuh. Mari kita optimalkan kueri ini dengan menambahkan indeks pada kolom ID, lalu jalankan pernyataan EXPLAIN lagi.
mysql> ALTER TABLE tb1 ADD KEY (id);
mysql> EXPLAIN SELECT * FROM tb1 WHERE id=100\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb1
partitions: NULL
type: ref
possible_keys: id
key: id
key_len: 4
ref: const
rows: 1
filtered: 100.00
Extra: NULL
Sekarang, output menunjukkan bahwa server fleksibel Azure Database for MySQL menggunakan indeks untuk membatasi jumlah baris menjadi 1, yang secara dramatis mempersingkat waktu pencarian.
Indeks penutup
Indeks penutup mencakup semua kolom kueri untuk mengurangi pengambilan nilai dari tabel data. Pernyataan GROUP BY berikut dan output terkait menggambarkan hal ini.
mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 995789
filtered: 11.11
Extra: Using where; Using temporary; Using filesort
Output menunjukkan bahwa server fleksibel Azure Database for MySQL tidak menggunakan indeks apa pun, karena indeks yang tepat tidak tersedia. Output juga menunjukkan Menggunakan sementara; Menggunakan filesort, yang menunjukkan bahwa server fleksibel Azure Database for MySQL membuat tabel sementara untuk memenuhi klausa GROUP BY .
Membuat indeks hanya pada kolom c2 tidak ada bedanya, dan server fleksibel Azure Database for MySQL masih perlu membuat tabel sementara:
mysql> ALTER TABLE tb1 ADD KEY (c2);
mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 995789
filtered: 11.11
Extra: Using where; Using temporary; Using filesort
Dalam hal ini, Anda dapat membuat indeks tertutup pada c1dan c2 dengan menambahkan nilai c2" langsung dalam indeks, yang dapat menghapus pencarian data lebih lanjut.
mysql> ALTER TABLE tb1 ADD KEY covered(c1,c2);
mysql> EXPLAIN SELECT MAX(c1), c2 FROM tb1 WHERE c2 LIKE '%100' GROUP BY c1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb1
partitions: NULL
type: index
possible_keys: covered
key: covered
key_len: 108
ref: NULL
rows: 995789
filtered: 11.11
Extra: Using where; Using index
Seperti yang ditunjukkan oleh output EXPLAIN di atas, server fleksibel Azure Database for MySQL sekarang menggunakan indeks tercakup dan menghindari harus membuat tabel sementara.
Indeks gabungan
Indeks gabungan terdiri dari nilai dari beberapa kolom dan dapat dianggap sebagai array baris yang diurutkan dengan menggabungkan nilai kolom terindeks. Metode ini dapat berguna dalam pernyataan GROUP BY.
mysql> EXPLAIN SELECT c1, c2 from tb1 WHERE c2 LIKE '%100' ORDER BY c1 DESC LIMIT 10\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 995789
filtered: 11.11
Extra: Using where; Using filesort
Server fleksibel Azure Database for MySQL melakukan operasi pengurutan file yang cukup lambat, terutama ketika harus mengurutkan banyak baris. Untuk mengoptimalkan kueri ini, buat indeks gabungan pada kedua kolom yang sedang diurutkan.
mysql> ALTER TABLE tb1 ADD KEY my_sort2 (c1, c2);
mysql> EXPLAIN SELECT c1, c2 from tb1 WHERE c2 LIKE '%100' ORDER BY c1 DESC LIMIT 10\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tb1
partitions: NULL
type: index
possible_keys: NULL
key: my_sort2
key_len: 108
ref: NULL
rows: 10
filtered: 11.11
Extra: Using where; Using index
Output pernyataan EXPLAIN sekarang menunjukkan bahwa server fleksibel Azure Database for MySQL menggunakan indeks gabungan untuk menghindari pengurutan tambahan karena indeks sudah diurutkan.
Kesimpulan
Anda dapat meningkatkan performa secara signifikan dengan menggunakan EXPLAIN bersama dengan berbagai jenis indeks. Memiliki indeks pada tabel tidak selalu berarti bahwa server fleksibel Azure Database for MySQL dapat menggunakannya untuk kueri Anda. Selalu validasi asumsi Anda menggunakan EXPLAIN dan optimalkan kueri menggunakan indeks.
Langkah berikutnya
- Untuk menemukan jawaban serekan atas pertanyaan Anda yang paling penting atau memposting atau menjawab pertanyaan, kunjungi Stack Overflow.