Heim  >  Artikel  >  Datenbank  >  Beispiel für die Verwendung eines MySQL-Index: Analyse_MySQL

Beispiel für die Verwendung eines MySQL-Index: Analyse_MySQL

WBOY
WBOYOriginal
2016-08-20 08:48:14996Durchsuche

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 Sekunden

Lö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 Sekunden

Frage 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ützen

Ich 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";


Dies liegt daran, dass Ihre Verwendung von Union falsch ist. Bei einer Union-Operation darf die order by-Anweisung nicht in zwei durch eine Union-Operation kombinierten Select-Anweisungen vorkommen. Die Sortierung kann durch Angabe einer order by-Klausel nach der zweiten select-Anweisung erfolgen.

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn