Làm thế nào để Yelp tính toán hiệu quả khoảng cách trong cơ sở dữ liệu?


9

Ví dụ: giả sử tôi có một bảng:

Business(BusinessID, Lattitude, Longitude)

Tất cả đều được lập chỉ mục tất nhiên. Ngoài ra có 1 triệu hồ sơ

Nói rằng tôi muốn tìm các doanh nghiệp gần 106,5, ví dụ, làm thế nào để tôi làm như vậy?

Nếu tôi làm

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

ví dụ, hoặc nếu tôi làm

SELECT *
FROM Business
TOP 20

Về lý thuyết, máy tính sẽ phải tính toán khoảng cách cho tất cả các biz trong khi thực tế chỉ những người có mạng và kinh độ trong một phạm vi nhất định cần được tính toán.

Vì vậy, làm thế nào tôi có thể làm những gì tôi muốn trong PhP, hoặc SQL chẳng hạn?

Tôi biết ơn với câu trả lời cho đến nay. Tôi đang sử dụng mysql và họ không có gì hiệu quả hơn giải pháp rõ ràng. Không gian MySQL cũng không có chức năng tính toán khoảng cách.

Câu trả lời:


8

Nếu tôi hiểu chính xác câu hỏi (và tôi không chắc là tôi làm vậy), bạn có lo lắng về việc tính toán "(Some formula to compute distance here)"cho mỗi hàng trong bảng mỗi khi bạn thực hiện một truy vấn không?

Điều này có thể được giảm thiểu đến một mức độ bằng cách sử dụng các chỉ mục trên latitudelongitudevì vậy chúng ta chỉ phải tính khoảng cách cho một 'hộp' các điểm có chứa vòng tròn mà chúng ta thực sự muốn:

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

Trong đó 96, 116, v.v. được chọn để khớp với đơn vị của giá trị '2000' và điểm trên quả địa cầu bạn đang tính khoảng cách từ đó.

Việc sử dụng các chỉ mục này chính xác như thế nào sẽ phụ thuộc vào RDBMS của bạn và các lựa chọn mà trình hoạch định của nó đưa ra.

Nói chung, đây là một cách nguyên thủy để tối ưu hóa một loại tìm kiếm hàng xóm gần nhất . Nếu RDBMS của bạn hỗ trợ các chỉ mục GiST , như postgres thì bạn nên xem xét sử dụng chúng thay thế.


Tôi đã sử dụng mysql. Tuy nhiên, một số công cụ mysql hỗ trợ địa lý mặc dù không phải là innodb.
dùng4951

Tôi có đúng rằng bạn không có tùy chọn để thay đổi từ MySQL? Trong trường hợp nào, vui lòng gắn thẻ câu hỏi mysql
Jack nói hãy thử topanswers.xyz

Trên thực tế bây giờ tôi thêm bảng phụ trợ của myisam làm thế nào để tôi làm điều này một cách hiệu quả sau đó?
dùng4951

Vâng, tôi có thể sử dụng mongodb. Tôi đã không quyết định điều đó. Tuy nhiên, tôi quen thuộc nhất với mysql.
dùng4951

1
Lời khuyên của tôi là hãy làm quen với postgres nếu hoàn toàn rõ ràng - so với MongoDB, nó tương tự như MySQL và có một lịch sử vững chắc với dữ liệu không gian và nhận xét của bạn ở nơi khác cho thấy bạn thích 'miễn phí'.
Jack nói hãy thử topanswers.xyz

6

(Tiết lộ: Tôi là một người dùng Microsoft SQL Server, vì vậy câu trả lời của tôi bị ảnh hưởng bởi điều đó.)

Để thực sự làm điều đó một cách hiệu quả, có hai điều bạn muốn: bộ nhớ đệm và hỗ trợ dữ liệu không gian riêng. Hỗ trợ dữ liệu không gian cho phép bạn lưu trữ dữ liệu địa lý và hình học trực tiếp trong cơ sở dữ liệu mà không cần thực hiện các phép tính chuyên sâu / đắt tiền và cho phép bạn xây dựng các chỉ mục để nhanh chóng tìm thấy điểm gần nhất với vị trí hiện tại của bạn (hoặc tuyến hiệu quả nhất hoặc bất cứ điều gì).

Bộ nhớ đệm rất quan trọng nếu bạn muốn mở rộng quy mô, thời gian. Truy vấn nhanh nhất là một truy vấn bạn không bao giờ thực hiện. Bất cứ khi nào người dùng yêu cầu những thứ gần gũi nhất với anh ta, bạn lưu trữ vị trí của anh ta và kết quả được đặt trong bộ đệm như Redis hoặc memcached trong một khoảng thời gian. Địa điểm kinh doanh sẽ không thay đổi trong 4 giờ - tốt, họ có thể nếu ai đó chỉnh sửa doanh nghiệp, nhưng bạn không nhất thiết phải cập nhật ngay lập tức trong tất cả các bộ kết quả.


Tôi không thể tìm ra từ liên kết của bạn liệu SQL Server có thực sự lập chỉ mục dữ liệu không gian theo cách hữu ích để lấy danh sách các điểm gần đó không?
Jack nói hãy thử topanswers.xyz


Vấn đề là tôi đang sử dụng mysql và tôi đã xác minh rằng họ không có thuật toán nào hiệu quả hơn những gì Jack Douglas quy định. Tôi tự hỏi nếu mysql sẽ làm điều đó giống như bộ nhớ đệm. Microsoft SQL được trả tiền và mysql miễn phí
user4951

1
Địa điểm kinh doanh sẽ không thay đổi mọi lúc, tuy nhiên địa điểm của mọi người sẽ.
dùng4951

0

Yelp có khả năng sử dụng GIS

PostgreSQL có triển khai tham chiếu cho GIS với PostGIS . Yelp có thể đang sử dụng MySQL kém hơn về mọi mặt . Trong trường hợp giống như Yelp, họ gần như chắc chắn giữ tọa độ cho,

  • Người dùng
  • Những điểm đến tiềm năng

Các tọa độ đó gần như chắc chắn trong WGS84 và được lưu trữ dưới dạng Địa lý. Trong PostgreSQL và PostGIS, nó sẽ trông giống như thế này,

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;

Họ sẽ điền vào bảng đó. Sau đó, họ lấy tọa độ WGS84 từ điện thoại của bạn và tạo một truy vấn, như thế này với SQL Alchemy (trong trường hợp của Yelp),

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

Để biết thêm thông tin, hãy xem của chúng tôi và xem Hệ thống thông tin địa lý @ StackExchange

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.