MYSQL IÇIN AZURE VERITABANı - Esnek Sunucuda EXPLAIN kullanarak profil sorgusu performansı
ŞUNLAR IÇIN GEÇERLIDIR: MySQL için Azure Veritabanı - Tek Sunucu MySQL için Azure Veritabanı - Esnek Sunucu
Önemli
MySQL için Azure Veritabanı tek sunucu kullanımdan kaldırma yolundadır. Esnek MySQL için Azure Veritabanı sunucuya yükseltmenizi kesinlikle öneririz. MySQL için Azure Veritabanı esnek sunucuya geçiş hakkında daha fazla bilgi için bkz. MySQL için Azure Veritabanı Tek Sunucu'ya neler oluyor?
EXPLAIN , sorguları iyileştirmenize yardımcı olabilecek kullanışlı bir araçtır. SQL deyimlerinin nasıl çalıştırıldığından bilgi almak için EXPLAIN deyimini kullanabilirsiniz. Aşağıda, EXPLAIN deyiminin çalıştırılmasından elde edilen örnek çıkış gösterilmektedir.
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
Bu örnekte anahtarın değeri NULL'tır; bu da esnek MySQL için Azure Veritabanı sunucunun sorgu için en iyi duruma getirilmiş dizinleri bulamama anlamına gelir. Sonuç olarak, tam tablo taraması gerçekleştirir. Kimlik sütununa bir dizin ekleyerek bu sorguyu iyileştirelim ve ardından EXPLAIN deyimini yeniden çalıştıralım.
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
Şimdi çıktı, esnek MySQL için Azure Veritabanı sunucunun satır sayısını 1 ile sınırlamak için bir dizin kullandığını ve bu da arama süresini önemli ölçüde kısalttığını gösteriyor.
Kapsayan dizin
Kapsayan dizin, veri tablolarından değer almayı azaltan bir sorgunun tüm sütunlarını içerir. Aşağıdaki GROUP BY deyimi ve ilgili çıktı bunu gösterir.
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
Çıktı, uygun dizinler kullanılamadığından esnek MySQL için Azure Veritabanı sunucunun dizin kullanmadığını gösterir. Çıkışta Ayrıca Geçici kullanma; Esnek MySQL için Azure Veritabanı sunucunun GROUP BY yan tümcesini karşılamak için geçici bir tablo oluşturduğunu gösteren filesort kullanma.
Yalnızca c2 sütununda dizin oluşturmak fark yaratmaz ve MySQL için Azure Veritabanı esnek sunucunun yine de geçici bir tablo oluşturması gerekir:
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
Bu durumda, c2" değerini doğrudan dizine ekleyerek hem c1 hem de c2 üzerinde kapsanan bir dizin oluşturabilirsiniz ve bu da daha fazla veri aramayı ortadan kaldırır.
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
Yukarıdaki EXPLAIN çıktısının da gösterdiği gibi, esnek MySQL için Azure Veritabanı sunucu artık kapsanan dizini kullanır ve geçici bir tablo oluşturmak zorunda kalmaktan kaçınır.
Birleşik dizin
Birleştirilmiş dizin birden çok sütundaki değerlerden oluşur ve dizine alınan sütunların değerleri birleştirilerek sıralanan bir satır dizisi olarak kabul edilebilir. Bu yöntem GROUP BY deyiminde yararlı olabilir.
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
MySQL için Azure Veritabanı esnek sunucu, özellikle de çok sayıda satırı sıralamak zorunda olduğunda oldukça yavaş bir dosya sıralama işlemi gerçekleştirir. Bu sorguyu iyileştirmek için sıralanan sütunların her ikisinde de birleştirilmiş dizin oluşturun.
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
EXPLAIN deyiminin çıktısı artık MySQL için Azure Veritabanı esnek sunucunun dizin zaten sıralandığından ek sıralamayı önlemek için birleşik bir dizin kullandığını gösteriyor.
Sonuç
EXPLAIN'i farklı dizin türleriyle birlikte kullanarak performansı önemli ölçüde artırabilirsiniz. Bir tabloda dizin olması, MySQL için Azure Veritabanı esnek sunucunun bunu sorgularınız için kullanabileceği anlamına gelmez. HER zaman EXPLAIN kullanarak varsayımlarınızı doğrulayın ve dizinleri kullanarak sorgularınızı iyileştirin.
Sonraki adımlar
- En önemli sorularınızın eş yanıtlarını bulmak veya soru göndermek veya yanıtlamak için Stack Overflow'u ziyaret edin.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin