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.