In diesem Artikel wird die Verwendung von MySQL-Indizes anhand von Beispielen analysiert. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
MYSQL-Beschreibung:
Eine Artikelbibliothek mit zwei Tabellen: Kategorie und Artikel. Die Kategorie enthält 10 klassifizierte Daten. Der Artikel enthält 200.000 Artikel. Es gibt ein „article_category“-Feld im Artikel, das dem „category_id“-Feld in der Kategorie entspricht. Das Wort „article_category“ wurde als Index in der Artikeltabelle definiert. Die Datenbankgröße beträgt 1,3 GB.
Problembeschreibung:
Führen Sie eine sehr häufige Abfrage aus:
Der Code lautet wie folgt:
SELECT * FROM `article` WHERE Article_category=11 ORDER BY Article_id DESC LIMIT 5
Die Ausführungszeit beträgt etwa 5 SekundenLösung:
Index erstellen:
Der Code lautet wie folgt:
Index idx_u für Artikel erstellen (article_category,article_id);
Der Code lautet wie folgt:
SELECT * FROM `article` WHERE Article_category=11 ORDER BY Article_id DESC LIMIT 5
Reduziert auf 0,0027 SekundenFrage fortsetzen:
Der Code lautet wie folgt:
SELECT * FROM `article` WHERE Article_category IN (2,3) ORDER BY Article_id DESC LIMIT 5
Die Ausführungszeit beträgt 11,2850 Sekunden.Verwenden Sie ODER:
select * from article where article_category=2 or article_category=3 order by article_id desc limit 5
Ausführungszeit: 11.0777
Lösung: Vermeiden Sie die Verwendung von in oder oder (da dies sonst zum Scannen der Tabelle führt), verwenden Sie Union All
Verwenden Sie UNION ALL:
(select * from article where article_category=2 order by article_id desc limit 5) UNION ALL (select * from article where article_category=3 order by article_id desc limit 5) ORDER BY article_id desc limit 5
Ausführungszeit: 0,0261
Hinweis: Der Unterschied zwischen UNION und UNION ALL
In der Datenbank führen die Schlüsselwörter UNION und UNION ALL beide zwei Ergebnismengen zu einer zusammen, unterscheiden sich jedoch hinsichtlich der Verwendung und Effizienz.
UNION filtert doppelte Datensätze nach der Tabellenverknüpfung heraus, sortiert also nach der Tabellenverknüpfung die generierte Ergebnismenge, löscht doppelte Datensätze und gibt dann die Ergebnisse zurück.
In den meisten tatsächlichen Anwendungen werden keine doppelten Datensätze generiert. Die häufigsten sind die Prozesstabelle und die Verlaufstabelle UNION. Zum Beispiel:
select * from gc_dfys union select * from ls_jg_dfys
Diese SQL ruft beim Ausführen zunächst die Ergebnisse der beiden Tabellen ab, verwendet dann den Sortierraum zum Sortieren und Löschen doppelter Datensätze und gibt schließlich den Ergebnissatz zurück. Wenn die Tabellendaten groß sind, kann die Festplatte zum Sortieren verwendet werden.
UNION ALL kombiniert einfach die beiden Ergebnisse und gibt sie zurück. Wenn in den beiden zurückgegebenen Ergebnismengen doppelte Daten vorhanden sind, enthält die zurückgegebene Ergebnismenge auf diese Weise doppelte Daten.
In Bezug auf die Effizienz ist UNION ALL viel schneller als UNION. Wenn Sie also bestätigen können, dass die beiden zusammengeführten Ergebnismengen keine doppelten Daten enthalten, verwenden Sie UNION ALL wie folgt:
select * from gc_dfys union all select * from ls_jg_dfys
Hinweis: Reihenfolge nach Problem der Union alle in MySQL
Als ich heute MySQL-Datenbankcode schrieb, stellte ich fest, dass das Ergebnis der Vereinigung nicht erwartet wurde
$stime = date("H:i:s"); $sql1 = "select * from T where '$stime'>stime order by stime desc"; $sql2 = "select * from T where stime>'$stime' order by stime asc"; $sql = "($sql) union all ($sql2)";
Die Ergebnisse sind korrekt, wenn $sql1 bzw. $sql2 ausgeführt wird
Aber als ich $sql ausführte, stellte ich fest, dass das Ergebnis umgekehrt war. Der Teil von $sql1 wurde in aufsteigende Reihenfolge geändert und der Teil von $sql2 wurde in absteigende Reihenfolge geändert
Die Suche ergab keine zufriedenstellenden Antworten. Es scheint, dass einige Datenbanken die Wortreihenfolge nach
immer noch nicht unterstützenIch habe zufällig entdeckt, dass das funktioniert:
Der Code lautet wie folgt:
$sql = "select * from ($sql1) as temp1 union all select * from ($sql2) as temp2";
Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die speziellen Themen dieser Website ansehen: „Zusammenfassung der MySQL-Indexoperationsfähigkeiten“, „Umfassende Sammlung der MySQL-Protokolloperationsfähigkeiten“, „Zusammenfassung der MySQL-Transaktionsoperationsfähigkeiten“, „Umfassende Sammlung von MySQL-Kenntnissen für gespeicherte Prozeduren“, „Zusammenfassung der Techniken zum Sperren von MySQL-Datenbanken“ und „Zusammenfassung häufig verwendeter MySQL-Funktionen“
Ich hoffe, dass dieser Artikel für alle bei der MySQL-Datenbankplanung hilfreich sein wird.