Plan A Mit einer großen Anzahl von Zeilen, INDEX(lat)
ist ein Rohrkrepierer, Performance-weise, sogar mit auf einen Streifen zu beschränken: AND lat BETWEEN 65 AND 69
. INDEX(lat, lng)
ist nicht besser, weil der Optimierer würde nicht beiden Spalten verwenden, auch mit AND lng BETWEEN...
Plan B Ihre nächste Wahl wird lat und lng beinhaltet, sowie eine Unterabfrage. Und Version 5.6 wäre von Vorteil. Es ist so etwas wie dieser (nach einschließlich INDEX(lat, lng, id)
):
SELECT ... FROM (
SELECT id FROM tbl
WHERE lat BETWEEN...
AND lng BETWEEN...) x
JOIN tbl USING (id)
WHERE ...;
Aus verschiedenen Gründen ist Plan B nur geringfügig besser als-Plan A.
Plan C Mit Millionen von Zeilen, die Sie benötigen my pizza parlor algorithm . Hierbei handelt es sich um eine Stored Procedure, mit der die Tabelle wiederholt untersucht werden kann, wobei nach genügend Zeilen gesucht werden muss. Es beinhaltet auch PARTITIONING, um einen groben 2D-Index zu erhalten. Der Link enthält einen Referenzcode, der das Filtern von Dingen wie der Kategorie beinhaltet.
Plan A und B O (sqrt (N)); Plan C ist O (1). , dass für Pläne A und B ist, wenn Sie die Anzahl der Zeilen zu vervierfachen, Sie sich die Zeit genommen verdoppeln. Plan C wird nicht langsamer als Sie N. erhöhen