Delen via


Prestaties van profielquery's in Azure Database for MySQL - Flexible Server met behulp van EXPLAIN

VAN TOEPASSING OP: Azure Database for MySQL - Enkele server Azure Database for MySQL - Flexibele server

Belangrijk

Azure Database for MySQL enkele server bevindt zich op het buitengebruikstellingspad. We raden u ten zeerste aan een upgrade uit te voeren naar een flexibele Azure Database for MySQL-server. Zie Wat gebeurt er met Azure Database for MySQL Enkele server voor meer informatie over migreren naar Azure Database for MySQL Flexibele server ?

EXPLAIN is een handig hulpmiddel waarmee u query's kunt optimaliseren. U kunt een UITLEG-instructie gebruiken om informatie te krijgen over hoe SQL-instructies worden uitgevoerd. Hieronder ziet u voorbeelduitvoer van het uitvoeren van een EXPLAIN-instructie.

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

In dit voorbeeld is de waarde van de sleutel NULL, wat betekent dat azure Database for MySQL flexibele server geen indexen kan vinden die zijn geoptimaliseerd voor de query. Hierdoor wordt er een volledige tabelscan uitgevoerd. We gaan deze query optimaliseren door een index toe te voegen aan de kolom ID en vervolgens de INSTRUCTIE EXPLAIN opnieuw uit te voeren.

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

In de uitvoer ziet u nu dat azure Database for MySQL flexibele server een index gebruikt om het aantal rijen te beperken tot 1, waardoor de zoektijd aanzienlijk wordt verkort.

Index dekken

Een dekkingsindex bevat alle kolommen van een query, waardoor het ophalen van waarden uit gegevenstabellen wordt verminderd. De volgende GROUP BY-instructie en gerelateerde uitvoer illustreert dit.

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

De uitvoer laat zien dat azure Database for MySQL flexibele server geen indexen gebruikt, omdat de juiste indexen niet beschikbaar zijn. In de uitvoer ziet u ook Het gebruik van tijdelijk; Met behulp van filesort, wat aangeeft dat azure Database for MySQL flexibele server een tijdelijke tabel maakt om te voldoen aan de GROUP BY-component .

Het maken van een index alleen op kolom c2 maakt geen verschil en azure Database for MySQL flexibele server moet nog steeds een tijdelijke tabel maken:

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

In dit geval kunt u een gedekte index maken op zowel c1 als c2 door de waarde van c2 rechtstreeks in de index toe te voegen, waardoor verdere gegevenszoekacties worden geëlimineerd.

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

Zoals in de uitvoer van het bovenstaande UITLEG wordt weergegeven, maakt Azure Database for MySQL Flexibele server nu gebruik van de gedekte index en voorkomt u dat u een tijdelijke tabel hoeft te maken.

Gecombineerde index

Een gecombineerde index bestaat uit waarden uit meerdere kolommen en kan worden beschouwd als een matrix van rijen die worden gesorteerd op het samenvoegen van waarden van de geïndexeerde kolommen. Deze methode kan handig zijn in een GROUP BY-instructie .

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

Azure Database for MySQL flexibele server voert een bestandssorteerdbewerking uit die redelijk traag is, met name wanneer het veel rijen moet sorteren. Als u deze query wilt optimaliseren, maakt u een gecombineerde index voor beide kolommen die worden gesorteerd.

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

In de uitvoer van de INSTRUCTIE EXPLAIN ziet u nu dat azure Database for MySQL flexibele server een gecombineerde index gebruikt om extra sortering te voorkomen omdat de index al is gesorteerd.

Conclusie

U kunt de prestaties aanzienlijk verbeteren door EXPLAIN samen met verschillende typen indexen te gebruiken. Het hebben van een index in een tabel betekent niet noodzakelijkerwijs dat azure Database for MySQL flexibele server deze kan gebruiken voor uw query's. Valideer altijd uw veronderstellingen met behulp van EXPLAIN en optimaliseer uw query's met behulp van indexen.

Volgende stappen

  • Als u peerantwoorden wilt vinden op uw belangrijkste vragen of als u een vraag wilt posten of beantwoorden, gaat u naar Stack Overflow.