Sie können in diesem Fall keinen Index verwenden, da Sie einen RANGE verwenden Filterbedingung.
Wenn Sie so etwas verwenden würden:
SELECT *
FROM values_table this_
WHERE this_.value1 = @value
ORDER BY
value2
LIMIT 10
, und erstellen Sie dann einen zusammengesetzten Index für (VALUE1, VALUE2) sowohl zum Filtern als auch zum Bestellen verwendet werden.
Aber Sie verwenden eine Bereichsbedingung, deshalb müssen Sie die Bestellung trotzdem durchführen.
Ihr zusammengesetzter Index sieht folgendermaßen aus:
value1 value2 ----- ------ 1 10 1 20 1 30 1 40 1 50 1 60 2 10 2 20 2 30 3 10 3 20 3 30 3 40
, und wenn Sie 1 auswählen und 2 in value1 , erhalten Sie immer noch keinen ganzen sortierten Satz von value2 .
Wenn Ihr Index auf value2 ist nicht sehr selektiv (d.h. es gibt nicht viele DISTINCT value2 in der Tabelle), könnten Sie versuchen:
CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)
/* Note the order, it's important */
SELECT *
FROM (
SELECT DISTINCT value2
FROM mytable
ORDER BY
value2
) q,
mytable m
WHERE m.value2 >= q.value2
AND m.value2 <= q.value2
AND m.value1 BETWEEN 13123123 AND 123123123
Dies wird als SKIP SCAN bezeichnet Zugriffsmethode. MySQL unterstützt es nicht direkt, aber es kann so emuliert werden.
Der RANGE access wird in diesem Fall verwendet, aber wahrscheinlich erhalten Sie keinen Leistungsvorteil, es sei denn DISTINCT value2 weniger als etwa 1% umfassen Zeilen.
Beachten Sie die Verwendung von:
m.value2 >= q.value2
AND m.value2 <= q.value2
statt
m.value2 = q.value2
Dies macht MySQL Führen Sie RANGE aus Überprüfung auf jeder Schleife.