sql >> Databasteknik >  >> RDS >> Mysql

Söker efter de 5 platserna som ligger närmast ett postnummer – vilken väg ska jag gå?

Först några kommentarer...

Jag har sett dussintals (inte miljoner) implementeringar här och på andra forum; din är bättre än de flesta.

Enligt en datakälla (som jag råkar ha laddat ner) finns det cirka 3,2 miljoner städer i världen.

För prestanda måste du undvika att kontrollera alla 3M-rader. Du har gjort en bra start med den växande bounding boxen. Observera att du borde ha

INDEX(lat, lon),
INDEX(lon, lat)

Optimeraren kommer att välja mellan dessa och den första frågan (med COUNT(*) ) kommer att se det som "täckande". Det blir en rand runt jordklotet eller en kil; en klar förbättring jämfört med 3M rader. Den sämsta latituden (+34 grader) har 96K städer i sig. (1 grad =69 miles / 111 km.) För en tiondels grad är 34,4 sämst, med 10 000 städer.

(Ja, jag gillar den här typen av datapussel.)

Och jag ser att du hanterar datumlinjen och polerna. Jag tror inte att du kan bli bättre på att ha dem som ett specialfall.

(Jag har bara tittat på formlerna och konstanterna.)

Geohash och Z-order indexering hjälp. Men de har en hicka i och med att du måste kontrollera upp till fyra områden runt målet -- Det är som att inte inse att heltalen 199999 och 200000 är riktigt nära varandra, trots att den första siffran i varje är olika.

"Användarpass i postnummer eller stadsnamn" - det är en punktfråga i en av två enkla tabeller. (Förutom att det kan finnas dups -- över 320 vardera av "san jose" och "san antonio". Ganska långt ner på listan finns det första icke-spanska namnet:"victoria", med endast 144 städer.)

För det andra, min implementering... (Den har vissa likheter med din.)

http://mysql.rjweb.org/doc.php/latlng

Detta förbättrar prestandan genom att använda PARTITIONing att hålla begränsningsramen nere på ungefär en kvadrat, istället för en rand eller kil. Om du letar efter de 5 närmaste, kommer min algoritm sällan att vidröra mer än några dussin rader, och dessa rader kommer att "klustras" i ett litet antal block, vilket håller antalet diskträffar väldigt lågt.

En viktig sak i min design är att ha alla nödvändiga kolumner i en tabell. När du har hittat närmaste 5, kan du gå till andra bord för att få hjälpsaker (telefonnummer, etc).

När det gäller postnummer, ändra dem till lat/lon innan du börjar söka efter de 5 närmaste.

En koppling inuti algoritmen kommer med stor sannolikhet att förstöra prestandan.



  1. Hantera Liquibase med GitFlow utvecklingsmodell

  2. SAMMANFATTAR alla fält i olika tabeller JOIN

  3. Hur importerar jag en SQL-fil med kommandoraden i MySQL?

  4. Skapa Lucene Index i databasen med JdbcDirectory