2017-09-28 2 views
-1

Wir haben einen (großen) Tisch mit einem mehrspaltigen Index für die Spalten A, B und C. Jetzt haben wir eine Abfrage mit dem folgenden Format tun: SELECT * FROM table WHERE (B=... AND C=...) OR (B=... AND C=...) OR ... Da es viele Zeilen in der Tabelle, und kein Index verwendet wird, ist die Leistung der Abfrage sehr schlecht.MySQL - überspringen Spalte in Index

Ein Index mit den Spalten B, C wäre ideal gewesen, leider ist er nicht verfügbar, und wir können ihn auch nicht ändern (anderer Anbieter). Spalte A hat einen Wert, an dem wir nicht interessiert sind.

Damit MySQL den verfügbaren Index verwenden kann, haben wir in der WHERE eine zusätzliche Bedingung hinzugefügt: SELECT * FROM table WHERE (A IN (1, 2, 3, 4, 5, ..., 99, 100)) ((B=... AND C=...) OR (B=... AND C=...))OR .... Das Ergebnis ist, dass der Index jetzt ordnungsgemäß verwendet wird und die Abfrageleistung bereits viel besser ist. Es sieht jedoch ein wenig hässlich aus, alle möglichen Werte von A in der Abfrage anzugeben. Mein Gefühl ist, dass es einen einfacheren Weg geben sollte, dasselbe zu tun, oder sogar mit einer besseren Leistung.

Gibt es eine Möglichkeit, MySQL zu zwingen, den Index zu verwenden, auch wenn Spalte A nicht in der Abfrage verwendet wird? Oder haben wir schon die beste Lösung gefunden?

Antwort

0

Ja, könnte funktionieren!

MySQL index hint

Grundsätzlich FROM table USE INDEX (index_name) oder FROM table FORCE INDEX (index_name) sagen

Aber das wird nicht helfen, denn im Grunde, wenn Sie einen Index erzwingen, es ist wieder eine vollständige Tabellen-Scan zu tun.

Versuchen Sie stattdessen

FROM table 
WHERE A IN (SELECT DISTINCT A FROM table) 
AND .... 

sein könnte sauberer

+0

Sorry, nicht mit meiner Antwort fertig war, es funktioniert nicht sagen wollte !!! und Testen der saubereren Version –

Verwandte Themen