sql - zwischen - Mehrere und einzelne Indizes




sql zusammengesetzter primärschlüssel fremdschlüssel (3)

Es ist sehr unwahrscheinlich, dass die bloße Existenz eines Index eine SELECT Abfrage verlangsamt: Sie wird einfach nicht verwendet.

Theoretisch kann der Optimierer fälschlicherweise einen längeren Index für (a, b) als einen für (a) auswählen, um die Abfrage zu bedienen, die nur nach a sucht.

In der Praxis habe ich es nie gesehen: MySQL normalerweise den umgekehrten Fehler und nimmt einen kürzeren Index, wenn ein längerer existiert.

Aktualisieren:

In Ihrem Fall ist eine der folgenden Konfigurationen für alle Abfragen ausreichend:

(a, b); (b)

oder

(b, a); (a)

MySQL kann auch zwei separate Indizes mit index_intersect , um diese Indizes zu erstellen

(a); (b)

wird auch die Abfrage mit a = 1 AND b = 1 beschleunigen, wenn auch in geringerem Maße als die obigen Lösungen.

Vielleicht möchten Sie auch diesen Artikel in meinem Blog lesen:

Update 2:

Scheint habe ich deine Frage endlich verstanden :)

ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b);

Ausgezeichnet für a = 1 und b = 1 , ziemlich gut für a = 1 AND b = 1

ALTER TABLE ... ADD INDEX (a, b);

Ausgezeichnet für a = 1 AND b = 1 , fast ausgezeichnet für a = 1 , schlecht für b = 1

ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b); ALTER TABLE ... ADD INDEX (a, b);

Ausgezeichnet für alle drei Abfragen.

Ich schäme mich etwas, das zu fragen, da ich seit Jahren mit MySQL arbeite, aber naja.

Ich habe einen Tisch mit zwei Feldern, a und b . Ich werde die folgenden Abfragen darauf ausführen:

  • SELECT * FROM ... WHERE A = 1;
  • SELECT * FROM ... WHERE B = 1;
  • SELECT * FROM ... WHERE A = 1 AND B = 1;

Unter dem Gesichtspunkt der Leistung ist mindestens eine der folgenden Konfigurationen von Indizes für mindestens eine Abfrage langsamer ? Wenn ja, bitte erläutern.

  1. ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b);
  2. ALTER TABLE ... ADD INDEX (a, b);
  3. ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b); ALTER TABLE ... ADD INDEX (a, b);

Danke (beachten Sie, dass wir über nicht eindeutige Indizes sprechen)


Für das Beispiel, das Sie haben, ist der Indexsatz # 3 optimal. Mysql wählt die einzelnen A- und B-Indizes für einzelne Spalten where-Klauseln und verwendet den zusammengesetzten Index für die A & B where-Klausel.


SQL wählt den Index, der die Abfrage am besten abdeckt. Ein Index für A, B deckt die Abfrage für Fall 1 und 3 ab, aber nicht für 2 (da die Primärindexspalte A ist).

Um alle drei Abfragen abzudecken, benötigen Sie zwei Indizes:

ALTER TABLE ... ADD INDEX (a, b); ALTER TABLE ... ADD INDEX (b)




indexing