MySQL: wie index eine "ODER" - Klausel

Ich bin ausführen der folgenden Abfrage,

SELECT COUNT(*)
FROM table
WHERE field1='value' AND (field2 >= 1000 OR field3 >= 2000)

Gibt es einen index über Feld1 und anderen zusammengesetzt, die über field2&feld3.

Sehe ich MySQL wählt immer die field1 index und macht dann eine Verknüpfung mit den beiden anderen Feldern, die ziemlich schlecht ist, denn es muss mitmachen 146.000 Zeilen.

Vorschläge, wie das zu verbessern? Dank

(EDIT NACH DEM VERSUCH, VORGESCHLAGENE LÖSUNG)

Sitz in der vorgeschlagenen Lösung habe ich gesehen, das auf Mysql beim spielen mit diesem.

SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION SELECT * FROM table WHERE columnB = value2) AS unionTable;

ist viel langsamer als ausführen:

SELECT COUNT(*)
FROM table
WHERE (columnA = value1 AND columnB = value2)
      OR (columnA = value1 AND columnC = value3)

Ist mit zwei Composite-index:

index1 (columnA,columnB)
index2 (columnA,columnC)

Interessant genug ist, dass Sie aufgefordert werden Mysql zu "erklären" der Abfrage-es nimmt immer index1 auf beide Fälle und index2 wird nicht verwendet.

Wenn ich die Indizes ändern:

index1 (columnB,columnA)
index2 (columnC,columnA)

Und die Abfrage:

SELECT COUNT(*)
FROM table
WHERE (columnB = value2 AND columnA = value1)
      OR (columnC = value3 AND columnA = value1)

Dann ist es der Schnellste Weg, die ich gefunden habe, arbeitet Mysql.

InformationsquelleAutor JoséMi | 2010-05-13

Schreibe einen Kommentar