Share via


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.