2012-03-29 12 views
1

Ich habe eine Tabelle mit einer Stichprobe von ~ 40k Zeilen, wobei jede Zeile einen Punkt (Längen- und Breitengrad) enthält. Ich verwende die räumliche Erweiterung von MySQL, um herauszufinden, welche Punkte innerhalb einer Grenze existieren.MySQL verwendet keinen möglichen Index - warum?

Wenn ich innerhalb einer Grenze suche, wo ich weiß, dass es wenige Ergebnisse geben wird, wird der Index verwendet, wie es sein sollte. Mein Testdatensatz besteht jedoch hauptsächlich aus Standorten in ganz Großbritannien (und der größere Live-Datensatz wird wahrscheinlich in Prozent ähnlich sein). Wenn ich in diesem Begrenzungsrahmen zu suchen, wird der Index nicht gebraucht bekommen und stattdessen ein vollständiger Tabellenscan durchgeführt wird:

id select_type  table type possible_keys  key key_len  ref  rows Extra 
1 SIMPLE   ep  ALL  PRIMARY,location NULL NULL  NULL 37221 Using where 

So scheint es, als ob MySQL ist die Entscheidung, den Index zu ignorieren, wenn die Anzahl der Zeilen, die es erwartet zu finden ist in der Nähe der Gesamtzahl der Zeilen.

Ist dies der Fall, und wenn ja, kann ich die Verwendung des Index erzwingen oder anderweitig sicherstellen, dass ein vollständiger Tabellenscan vermieden wird?

+1

Geben Sie Ihre Suchanfrage ein. Wahrscheinlich bekommen Sie viele Ergebnisse zurück. In diesem Fall wird vermieden, dass der Index durchlaufen wird, um viele Ergebnisse zurückzugeben, da er nicht benötigt wird. –

+0

Auch wenn Sie 'table_structure' posten können, wäre auch gut. –

Antwort

0

N.B war korrekt, einfach die LIMIT nach unten anpassen bedeutet, dass der Index verwendet wird. Offensichtlich wirklich.

+0

Lassen Sie sich von der LIMIT-Klausel nicht täuschen, es bedeutet nicht, dass irgendetwas verwendet wird. LIMIT OFFSET wird die Ergebnisse abrufen und dann die Anzahl der OFFSET-Elemente verwerfen. Wenn Sie MyISAM-Tabellen verwenden, suchen Sie nach "Late-Row-Lookups" und passen Sie Ihre Suchanfrage entsprechend an. –

Verwandte Themen