2010-02-02 33 views
7

Dự án của chúng tôi giữ cơ sở dữ liệu thế giới trong cấu trúc cây bên trong bảng INNODB của MySQL db. Trái đất là gốc, sau đó các quốc gia, sau đó là các vùng của quốc gia và các vị trí là lá.Làm thế nào để sử dụng các khóa ngoại và một chỉ mục không gian bên trong một bảng MySQL?

Khóa ngoài được sử dụng để cung cấp quyền truy cập nhanh vào trẻ em (ví dụ: các thành phố trong khu vực).

Bây giờ, chúng tôi muốn triển khai tìm kiếm địa lý nhanh trong cơ sở dữ liệu cho các tọa độ nhất định. Một giải pháp rõ ràng là sử dụng SPATIAL INDEX, đây là một tính năng của các bảng MyISAM. Nhưng bảng MyISAM không hỗ trợ khóa ngoài. Và các bảng INNODB không hỗ trợ INDAT SPATIAL.

Vì vậy, nếu chúng tôi sử dụng bảng MyISAM, chúng tôi phải từ bỏ khóa ngoại và điều đó sẽ khiến trẻ em tìm kiếm quá lâu.

Làm cách nào chúng ta có thể kết hợp tìm kiếm nhanh cho trẻ em trong cây và cũng có một chỉ số SPATIAL trong bảng?

+0

Lưu ý rằng mục đích chính của nước ngoài không phải là tăng tốc truy vấn, nhưng để thực thi mối quan hệ giữa các bảng. Điều sẽ tăng tốc độ tra cứu là chỉ mục mà bạn sẽ tạo cùng với khóa ngoại. – Benjamin

Trả lời

4

Làm cách nào chúng ta có thể kết hợp tìm kiếm nhanh cho trẻ em trong cây và cũng có chỉ số SPATIAL trong bảng?

Tạo các chỉ số trên idparentId bảng của bạn bằng tay:

CREATE INDEX ix_mytable_parentid ON mytable (parentid) 

Lưu ý rằng kể từ khi id có lẽ là một PRIMARY KEY nhất, không chỉ số rõ ràng là cần thiết trên it (một số sẽ được tạo ra ngầm).

BTW, nếu bạn đang có phân cấp dựa trên địa lý tự nhiên, điểm của việc sử dụng mối quan hệ cha-con để tìm kiếm là gì?

Bạn có thể thực hiện các truy vấn để sử dụng SPATIAL chỉ:

SELECT * 
FROM mytable m1 
JOIN mytable m2 
ON  MBRContains (m2.area, m1.area) 
     AND m2.parentId = m1.id 
WHERE m1.name = 'London' 

mà sẽ sử dụng các chỉ số không gian để tìm kiếm và các mối quan hệ để lọc tốt.

Các vấn đề liên quan