UITLEG gebruiken om queryprestaties te profilen in Azure Database for MariaDB
Belangrijk
Azure Database for MariaDB bevindt zich op het buitengebruikstellingspad. We raden u ten zeerste aan om te migreren naar Azure Database for MySQL. Zie Wat gebeurt er met Azure Database for MariaDB voor meer informatie over migreren naar Azure Database for MySQL.
EXPLAIN is een handig hulpmiddel om query's te optimaliseren. EXPLAIN-instructie kan worden gebruikt om informatie op te halen over hoe SQL-instructies worden uitgevoerd. In de volgende uitvoer ziet u een voorbeeld van de uitvoering 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
Zoals u in dit voorbeeld kunt zien, is de waarde van de sleutel NULL. Deze uitvoer betekent dat MariaDB geen indexen kan vinden die zijn geoptimaliseerd voor de query en dat er een volledige tabelscan wordt uitgevoerd. We gaan deze query optimaliseren door een index toe te voegen aan de id-kolom .
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
De nieuwe UITLEG laat zien dat MariaDB nu een index gebruikt om het aantal rijen te beperken tot 1, wat op zijn beurt de zoektijd aanzienlijk verkort.
Index dekken
Een dekkingsindex bestaat uit alle kolommen van een query in de index om het ophalen van waarde uit gegevenstabellen te verminderen. Hier volgt een afbeelding in de volgende GROUP BY-instructie .
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
Zoals te zien is in de uitvoer, gebruikt MariaDB geen indexen omdat er geen juiste indexen beschikbaar zijn. Het toont ook Het gebruik van tijdelijk; Met behulp van het sorteren van bestanden, wat betekent dat MariaDB een tijdelijke tabel maakt om te voldoen aan de GROUP BY-component .
Het maken van een index op kolom c2 maakt alleen geen verschil en MariaDB 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 kan een gedekte index op zowel c1 als c2 worden gemaakt, waarbij de waarde van c2 rechtstreeks in de index wordt toegevoegd om verdere gegevenszoekacties te elimineren.
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 hierboven uitgelegd, gebruikt MariaDB nu de gedekte index en vermijdt u het maken van een tijdelijke tabel.
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
MariaDB voert een bestandssorteerdbewerking uit die vrij traag is, met name wanneer het veel rijen moet sorteren. Als u deze query wilt optimaliseren, kunt u een gecombineerde index maken 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
De UITLEG laat nu zien dat MariaDB gecombineerde index kan gebruiken om extra sortering te voorkomen, omdat de index al is gesorteerd.
Conclusie
Het gebruik van EXPLAIN en een ander type indexen kan de prestaties aanzienlijk verhogen. Als u een index in de tabel hebt, betekent dit niet noodzakelijkerwijs dat MariaDB 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 meest bezorgde vragen of een nieuw vraag/antwoord wilt posten, gaat u naar de microsoft Q&A-vragenpagina of Stack Overflow.