2015-05-12 6 views
6

Mit einer MySQL-Tabelle mit mehr als 20 Millionen von Zeilen, gibt es eine Möglichkeit, mit Hibernate ein Kriterium, um zu bauen nächste Reihen eine geografische Breite und Länge gegeben zu erhalten?Hibernate Kriterien von Breiten- und Längen

Criteria Verwendung wäre toll, weil ich mehrere Filter verwenden müssen (Preis, Kategorie, etc.).

Schließlich ist es posible die Zeilen nach Entfernung erhalten? Oder gibt es zu viele Reihen?

Antwort

1

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