Yelp คำนวณระยะทางในฐานข้อมูลได้อย่างมีประสิทธิภาพได้อย่างไร


9

ตัวอย่างเช่นฉันมีตาราง:

Business(BusinessID, Lattitude, Longitude)

ทั้งหมดได้รับการจัดทำดัชนีแน่นอน นอกจากนี้ยังมี 1 ล้านบันทึก

สมมติว่าฉันต้องการค้นหาธุรกิจที่ใกล้เคียงกับ 106,5 ตัวอย่างเช่นฉันจะทำอย่างไร

ถ้าฉันทำ

SELECT *
FROM Business
WHERE (Some formula to compute distance here) < 2000

ตัวอย่างเช่นหรือถ้าฉันทำ

SELECT *
FROM Business
TOP 20

ในทางทฤษฎีคอมพิวเตอร์จะต้องคำนวณระยะทางสำหรับเจ้าหน้าที่ทุกคนในขณะที่ในทางปฏิบัติเฉพาะผู้ที่มี lattitude และลองจิจูดในช่วงที่ควรจะคำนวณ

ดังนั้นฉันจะทำสิ่งที่ฉันต้องการใน PhP หรือ SQL ได้อย่างไร

ฉันรู้สึกซาบซึ้งกับคำตอบที่ได้รับ ฉันกำลังใช้ mysql และพวกเขาไม่มีอะไรมีประสิทธิภาพมากกว่าโซลูชันที่ชัดเจน MySQL อวกาศไม่มีฟังก์ชันคำนวณระยะทางเช่นกัน

คำตอบ:


8

หากฉันเข้าใจคำถามอย่างถูกต้อง (และฉันไม่แน่ใจ) คุณกังวลเกี่ยวกับการคำนวณ"(Some formula to compute distance here)"สำหรับทุกแถวในตารางทุกครั้งที่คุณทำแบบสอบถาม

สิ่งนี้สามารถลดลงได้ในระดับหนึ่งโดยใช้ดัชนีlatitudeและlongitudeดังนั้นเราจึงต้องคำนวณระยะทางสำหรับ 'กล่อง' ของจุดที่มีวงกลมที่เราต้องการ:

select * from business
where (latitude>96 and latitude<116) and 
      (longitude>-5 and longitude<15) and 
      (Some formula to compute distance here) < 2000

โดยที่ 96, 116 ฯลฯ ได้รับเลือกให้ตรงกับหน่วยของค่า '2000' และจุดบนโลกที่คุณกำลังคำนวณระยะทาง

สิ่งนี้ใช้ดัชนีอย่างแม่นยำเพียงใดขึ้นอยู่กับ RDBMS ของคุณและตัวเลือกที่ผู้ทำวางแผนจะทำ

ในข้อตกลงนี้เป็นวิธีดั้งเดิมของการเพิ่มประสิทธิภาพชนิดของการค้นหาเพื่อนบ้านที่ใกล้ที่สุด หาก RDBMS ของคุณรองรับดัชนี GiSTเช่นpostgresคุณควรพิจารณาใช้ดัชนีแทน


ฉันใช้ mysql อย่างไรก็ตามเครื่องยนต์ mysql บางตัวรองรับ geopatial แต่ไม่ใช่ innodb
user4951

ฉันถูกที่คุณไม่มีตัวเลือกที่จะเปลี่ยนจาก MySQL? ในกรณีนี้โปรดติดแท็กคำถามmysql
แจ็คบอกว่าลอง topanswers.xyz

จริงๆแล้วตอนนี้ฉันเพิ่มตารางของ myisam ตอนนี้ฉันจะทำอย่างมีประสิทธิภาพได้อย่างไร
4951

ฉันสามารถใช้ Mongodb ได้ ฉันยังไม่ได้ตัดสินใจ อย่างไรก็ตามฉันคุ้นเคยกับ mysql มากที่สุด
4951

1
คำแนะนำของฉันคือการทำความคุ้นเคยกับ postgres ถ้าเป็นไปได้ - เมื่อเทียบกับ MongoDB จะคล้ายกับ MySQL มากและมีประวัติที่แข็งแกร่งกับข้อมูลเชิงพื้นที่และความคิดเห็นของคุณที่อื่นบ่งบอกว่าคุณชอบ 'ฟรี'
แจ็คบอกว่าลอง topanswers.xyz

6

(การเปิดเผย: ฉันเป็น Microsoft SQL Server guy ดังนั้นคำตอบของฉันจะได้รับอิทธิพลจากสิ่งนั้น)

หากต้องการดำเนินการอย่างมีประสิทธิภาพมีสองสิ่งที่คุณต้องการ: การแคชและการสนับสนุนข้อมูลเชิงพื้นที่ การสนับสนุนข้อมูลเชิงพื้นที่ช่วยให้คุณจัดเก็บข้อมูลภูมิศาสตร์และข้อมูลเรขาคณิตโดยตรงในฐานข้อมูลโดยไม่ต้องทำการคำนวณอย่างเข้มงวด / มีราคาแพงและช่วยให้คุณสร้างดัชนีเพื่อค้นหาจุดที่ใกล้ตำแหน่งปัจจุบันของคุณได้อย่างรวดเร็วมาก

การแคชเป็นสิ่งสำคัญหากคุณต้องการปรับระยะเวลา ข้อความค้นหาที่เร็วที่สุดคือคำถามที่คุณไม่เคยทำ เมื่อใดก็ตามที่ผู้ใช้ถามถึงสิ่งที่ใกล้เคียงกับเขามากที่สุดคุณจะเก็บตำแหน่งของเขาและผลลัพท์ที่ได้คือแคชเช่น Redis หรือ memcached เป็นระยะเวลาหนึ่งชั่วโมง สถานที่ตั้งธุรกิจจะไม่เปลี่ยนแปลงเป็นเวลา 4 ชั่วโมง - อาจเป็นได้ว่ามีใครบางคนแก้ไขธุรกิจ แต่คุณไม่จำเป็นต้องทำการอัปเดตในชุดผลลัพธ์ทั้งหมดทันที


ฉันไม่สามารถหาจากลิงก์ของคุณได้ว่า SQL Server ทำดัชนีข้อมูลปริภูมิในลักษณะที่เป็นประโยชน์ในการรับรายการของจุดที่อยู่ใกล้ ๆ หรือไม่?
แจ็คบอกว่าลอง topanswers.xyz


สิ่งนี้คือฉันใช้ mysql และฉันตรวจสอบแล้วว่าไม่มีอัลกอริทึมใด ๆ ที่มีประสิทธิภาพมากกว่าที่แจ็คดักลาสกำหนดไว้ ฉันสงสัยว่า mysql จะทำเช่นนั้นเช่นแคชหรือไม่ Microsoft SQL ได้รับค่าตอบแทนและ mysql ฟรี
4951

1
สถานที่ตั้งธุรกิจจะไม่เปลี่ยนแปลงตลอดเวลา แต่จะมีสถานที่ตั้งของผู้คน
4951

0

Yelp น่าจะใช้ GIS

PostgreSQL มีการดำเนินการอ้างอิงสำหรับ GIS กับPostGIS Yelp อาจใช้ MySQL ซึ่งด้อยกว่าในทุก ๆด้าน ในกรณีของสิ่งที่ชอบร้องเอ๋งพวกเขาเกือบจะเก็บพิกัดไว้

  • ผู้ใช้งาน
  • จุดหมายปลายทางที่มีศักยภาพ

พิกัดเหล่านั้นเกือบจะแน่นอนใน WGS84 และเก็บไว้เป็นประเภทภูมิศาสตร์ ใน PostgreSQL และ PostGIS มันจะเป็นแบบนี้

CREATE TABLE businesses (
  id   int               GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  name text,
  geog geography(point)
);
CREATE INDEX ON businesses USING gist(geog);
.... fill table
ANALYZE businesses;

พวกเขาจะเติมตารางนั้น จากนั้นพวกเขาจะจับพิกัด WGS84 จากโทรศัพท์ของคุณและสร้างแบบสอบถามเช่นนี้ด้วย SQL Alchemy (ในกรณีของ Yelp)

SELECT *
FROM businesses AS b
WHERE ST_DWithin( b.geog, ST_MakePoint(userLong,userLat) );

สำหรับข้อมูลเพิ่มเติมโปรดดูที่ และตรวจสอบระบบข้อมูลทางภูมิศาสตร์ @ StackExchange

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.