Neue Möglichkeiten, EXPLAIN in MySQL 8.1 und 8.2 zu spielen

Ab MySQL 8.1 führt EXPLAIN die INTO- Klausel ein, die es ermöglicht, die Ausgabe der EXPLAIN- Abfrage in Benutzervariablen zu speichern, anstatt sie an den Client zurückzugeben. Derzeit wird nur das JSON-Format unterstützt, dies sollte jedoch für die meisten Anwendungsfälle ausreichend sein.

Autor: Magnus Brevik

Ursprüngliche Adresse: https://dev.mysql.com/blog-archive/explain-into-and-explain-for-schema-in-mysql-81-and-82/

ERKLÄREN

Ab MySQL 8.1 führt EXPLAIN die INTO- Klausel ein, die es ermöglicht, die Ausgabe der EXPLAIN- Abfrage in Benutzervariablen zu speichern, anstatt sie an den Client zurückzugeben. Derzeit wird nur das JSON-Format unterstützt, dies sollte jedoch für die meisten Anwendungsfälle ausreichend sein.

Die Ausgabe von EXPLAIN wird nach der Benutzervariablen gespeichert, sodass sie als JSON-Objekt bearbeitet werden kann. Dadurch können Sie Daten direkt aus EXPLAIN programmgesteuert extrahieren, bearbeiten und in der Datenbank speichern.

Zum Beispiel:

mysql> SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id;
+-------------+----------+
| name        | quantity |
+-------------+----------+
| Screwdriver |       23 |
| Screwdriver |        1 |
| Locket      |       17 |
| Armoire     |       42 |
| Armoire     |       16 |
+-------------+----------+

Wenn Sie nur an den Gemeinkosten dieser Abfrage interessiert sind, können Sie die Abfrage zunächst als definieren @explain_output.

mysql> EXPLAIN FORMAT=JSON INTO @explain_output SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id;
Query OK, 0 rows affected (0,00 sec)

Die einzige Ausgabe, die Sie von diesem EXPLAIN erhalten, ist „ Query OK“. Wenn wir die vollständige EXPLAIN- Ausgabe sehen wollten , hatten wir diese Option @explain_output, aber die vollständige JSON-Ausgabe würde viel Platz beanspruchen, und mich interessieren nur die Kosten . Um aus einem JSON-Objekt zu extrahieren, verwenden Sie einfach die JSON-Funktion von MySQL für das angegebene JSON-Objekt.

mysql> SELECT JSON_EXTRACT(@explain_output, "$.query_block.cost_info.query_cost") AS query_cost;
+------------+
| query_cost |
+------------+
| "1.60"     |
+------------+

SCHEMA ERKLÄREN

Ab MySQL 8.2 führte EXPLAIN die FOR SCHEMA- Klausel ein. Es ermöglicht die Ausführung von EXPLAIN- Abfragen in anderen SCHEMAs als dem aktuellen SCHEMA . Dadurch ist es möglich, eine gespeicherte Prozedur PROCEDURE zu erstellen , um die am häufigsten ausgeführten Abfragen in jedem SCHEMA zu interpretieren und Statistiken darüber zu sammeln.

Wenn sich das aktuelle SCHEMA von dem SCHEMA unterscheidet, in dem sich die Tabelle befindet, die wir abfragen möchten, können wir dies tun

mysql> USE statistics;
mysql> EXPLAIN FORMAT=TREE FOR SCHEMA customer1 SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id;
-> Nested loop inner join  (cost=2.3 rows=5)
    -> Table scan on items  (cost=0.55 rows=3)
    -> Index lookup on orders using fk_item_id (item_id=items.id)  (cost=0.472 rows=1.67)

Dies mag für die meisten EXPLAIN- Verwendungsszenarien nicht sehr nützlich sein, aber wenn wir mehrere SCHEMAs mit derselben Tabellenstruktur haben und Statistiken für alle SCHEMAs gleichzeitig sammeln möchten, können wir an dieser Stelle eine gespeicherte Prozedur PROCEDURE erstellen, die dies für uns erledigt:

DELIMITER |
CREATE PROCEDURE explain_query_for_schema(IN schema_name VARCHAR(64), IN query VARCHAR(1000))
BEGIN
    SET @explain_stmt = CONCAT("EXPLAIN FORMAT=JSON INTO @explain_output FOR SCHEMA ", schema_name, " ", query);
    PREPARE stmt FROM @explain_stmt;
    EXECUTE stmt;
    INSERT INTO explain_outputs (schema_name, query, explain_output) VALUES (schema_name, query, @explain_output);
END |

CREATE PROCEDURE explain_query_for_all_schemas(IN query VARCHAR(1000))
BEGIN
    DECLARE done BOOLEAN DEFAULT FALSE;
    DECLARE schema_name VARCHAR(64);
    DECLARE cur_schema_names CURSOR FOR SELECT schema_name_table.schema_name FROM schema_name_table;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur_schema_names;

    explain_loop: LOOP
        FETCH cur_schema_names INTO schema_name;
        IF done THEN
            LEAVE explain_loop;
        END IF;
        CALL explain_query_for_schema(schema_name, query);
    END LOOP;
    CLOSE cur_schema_names;
END |
DELIMITER ;

SET @query = "SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id";
CALL explain_query_for_all_schemas(@query);

SELECT schema_name, query, JSON_EXTRACT(explain_output, "$.query_block.cost_info.query_cost") AS query_cost, created_at FROM explain_outputs;
+-------------+---------------------------------------------------------------------------+------------+---------------------+
| schema_name | query                                                                     | query_cost | created_at          |
+-------------+---------------------------------------------------------------------------+------------+---------------------+
| customer1   | SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id | "2.30"     | 2023-11-14 20:56:47 |
| customer2   | SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id | "0.70"     | 2023-11-14 20:56:47 |
| customer3   | SELECT name, quantity FROM orders JOIN items ON orders.item_id = items.id | "9.10"     | 2023-11-14 20:56:47 |
+-------------+---------------------------------------------------------------------------+------------+---------------------+

Das ist es. Zwei relativ einfache Erweiterungen von EXPLAIN mögen auf den ersten Blick nicht wichtig erscheinen, ermöglichen aber gespeicherten Prozeduren die programmgesteuerte Verarbeitung von EXPLAIN- Ausgaben. Wir verwenden es selbst im Fall von „Entfernen von Indexschätzungen mithilfe der MySQL-Autopilot-Indizierung“ , wobei EXPLAIN INTO und EXPLAIN FOR SCHEMA für die Datenerfassung zum Vorschlagen besserer Indizes von entscheidender Bedeutung sind. Wir hoffen, dass es für Sie genauso nützlich ist wie für uns.

Diese sind in der MySQL EXPLAIN-Dokumentation dokumentiert , wenn Sie mehr erfahren möchten .

Weitere technische Artikel finden Sie unter: https://opensource.actionsky.com/

Über SQLE

SQLE ist eine umfassende SQL-Qualitätsmanagementplattform, die die SQL-Prüfung und -Verwaltung von der Entwicklung bis zur Produktionsumgebung abdeckt. Es unterstützt gängige Open-Source-, kommerzielle und inländische Datenbanken, bietet Prozessautomatisierungsfunktionen für Entwicklung, Betrieb und Wartung, verbessert die Online-Effizienz und verbessert die Datenqualität.

SQLE erhalten

Typ Adresse
Repository https://github.com/actiontech/sqle
dokumentieren https://actiontech.github.io/sqle-docs/
Neuigkeiten veröffentlichen https://github.com/actiontech/sqle/releases
Entwicklungsdokumentation für das Datenaudit-Plug-in https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
Broadcom kündigte die Beendigung des bestehenden VMware-Partnerprogramms an . Site B stürzte zweimal ab, Tencents „3.29“-Vorfall der Stufe eins … Bestandsaufnahme der zehn häufigsten Ausfallvorfälle im Jahr 2023, Vue 3.4 „Slam Dunk“ veröffentlicht, Yakult bestätigte, dass 95G-Daten durchgesickert sind MySQL 5.7, Moqu, Li Tiaotiao... Bestandsaufnahme der (Open-Source-)Projekte und Websites, die 2023 „gestoppt“ werden „2023 China Open Source Developer Report“ wird offiziell veröffentlicht Rückblick auf die IDE vor 30 Jahren: nur TUI, helle Hintergrundfarbe …… Julia 1.10 offiziell veröffentlicht Rust 1.75.0 veröffentlicht NVIDIA hat GeForce RTX 4090 D speziell für den Verkauf in China auf den Markt gebracht
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/actiontechoss/blog/10560322
Recomendado
Clasificación