Hoạt động tìm kiếm trong cơ sở dữ liệu phi không gian có thể được tối ưu hóa bằng cách sử dụng chỉ mục
ALTER TABLE geom ADD SPATIAL INDEX[g];1. Điều này cũng đúng với cơ sở dữ liệu không gian. Với sự trợ giúp của rất nhiều phương pháp lập chỉ mục đa chiều đã được thiết kế trước đây, có thể tối ưu hóa các tìm kiếm không gian. Điển hình nhất trong số này là
MySQL sử dụng R-Tree với phép chia bậc hai cho các chỉ mục
ALTER TABLE geom ADD SPATIAL INDEX[g];1 trên các cột không gian. Chỉ mục
ALTER TABLE geom ADD SPATIAL INDEX[g];1 được tạo bằng cách sử dụng MBR của hình học. Đối với hầu hết các hình học, MBR là hình chữ nhật tối thiểu bao quanh hình học. Đối với một chuỗi ngang hoặc dọc, MBR là một hình chữ nhật được suy biến thành chuỗi. Đối với một điểm, MBR là một hình chữ nhật suy biến thành điểm
Cũng có thể tạo các chỉ mục bình thường trên các cột không gian. Trong chỉ mục không phải ______0_______1, bạn phải khai báo tiền tố cho bất kỳ cột không gian nào ngoại trừ cột
ALTER TABLE geom ADD SPATIAL INDEX[g];5
ALTER TABLE geom ADD SPATIAL INDEX[g];6 hỗ trợ cả chỉ mục
ALTER TABLE geom ADD SPATIAL INDEX[g];1 và không phải ______0_______1. Các công cụ lưu trữ khác hỗ trợ các chỉ mục không ____0_______1, như được mô tả trong
20. 6. 1. Tạo chỉ mục không gian
MySQL có thể tạo các chỉ mục không gian bằng cách sử dụng cú pháp tương tự như cú pháp để tạo các chỉ mục thông thường, nhưng được mở rộng bằng từ khóa
ALTER TABLE geom ADD SPATIAL INDEX[g];1. Hiện tại, các cột trong chỉ mục không gian phải được khai báo
CREATE SPATIAL INDEX sp_index ON geom [g];2. Các ví dụ sau minh họa cách tạo chỉ mục không gian
Với
CREATE SPATIAL INDEX sp_index ON geom [g];
3CREATE TABLE geom [g GEOMETRY NOT NULL, SPATIAL INDEX[g]];
Với
CREATE SPATIAL INDEX sp_index ON geom [g];
4ALTER TABLE geom ADD SPATIAL INDEX[g];
Với
CREATE SPATIAL INDEX sp_index ON geom [g];
0CREATE SPATIAL INDEX sp_index ON geom [g];
Đối với bảng
ALTER TABLE geom ADD SPATIAL INDEX[g];6,
CREATE SPATIAL INDEX sp_index ON geom [g];7 tạo chỉ mục cây R. Đối với các công cụ lưu trữ hỗ trợ lập chỉ mục phi không gian của các cột không gian, công cụ tạo chỉ mục cây B. Chỉ mục cây B trên các giá trị không gian sẽ hữu ích cho việc tra cứu giá trị chính xác, nhưng không hữu ích cho việc quét phạm vi
Để biết thêm thông tin về lập chỉ mục các cột không gian, hãy xem
Để loại bỏ các chỉ mục không gian, hãy sử dụng
CREATE SPATIAL INDEX sp_index ON geom [g];4 hoặc
ALTER TABLE geom DROP INDEX g;0
Với
CREATE SPATIAL INDEX sp_index ON geom [g];
4ALTER TABLE geom DROP INDEX g;
Với
ALTER TABLE geom DROP INDEX g;
0DROP INDEX sp_index ON geom;
Thí dụ. Giả sử rằng một bảng
ALTER TABLE geom DROP INDEX g;3 chứa hơn 32.000 hình học, được lưu trữ trong cột
ALTER TABLE geom DROP INDEX g;4 thuộc loại
ALTER TABLE geom DROP INDEX g;5. Bảng này cũng có một cột
ALTER TABLE geom DROP INDEX g;6
ALTER TABLE geom DROP INDEX g;7 để lưu trữ các giá trị ID đối tượng
mysql>DESCRIBE geom;
+-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | fid | int[11] | | PRI | NULL | auto_increment | | g | geometry | | | | | +-------+----------+------+-----+---------+----------------+ 2 rows in set [0.00 sec] mysql>SELECT COUNT[*] FROM geom;
+----------+ | count[*] | +----------+ | 32376 | +----------+ 1 row in set [0.00 sec]
Để thêm chỉ mục không gian trên cột
ALTER TABLE geom DROP INDEX g;4, hãy sử dụng câu lệnh này
mysql> ALTER TABLE geom ADD SPATIAL INDEX[g];
Query OK, 32376 rows affected [4.05 sec]
Records: 32376 Duplicates: 0 Warnings: 0
20. 6. 2. Sử dụng chỉ mục không gian
Trình tối ưu hóa điều tra xem liệu các chỉ mục không gian có sẵn có thể được tham gia vào việc tìm kiếm các truy vấn sử dụng một chức năng chẳng hạn như hoặc trong mệnh đề
DROP INDEX sp_index ON geom;1. Truy vấn sau tìm tất cả các đối tượng trong hình chữ nhật đã cho
mysql>SET @poly =
->'Polygon[[30000 15000,31000 15000,31000 16000,30000 16000,30000 15000]]';
mysql>SELECT fid,AsText[g] FROM geom WHERE
->MBRContains[GeomFromText[@poly],g];
+-----+---------------------------------------------------------------+ | fid | AsText[g] | +-----+---------------------------------------------------------------+ | 21 | LINESTRING[30350.4 15828.8,30350.6 15845,30333.8 15845,30 .. | | 22 | LINESTRING[30350.6 15871.4,30350.6 15887.8,30334 15887.8, .. | | 23 | LINESTRING[30350.6 15914.2,30350.6 15930.4,30334 15930.4, .. | | 24 | LINESTRING[30290.2 15823,30290.2 15839.4,30273.4 15839.4, .. | | 25 | LINESTRING[30291.4 15866.2,30291.6 15882.4,30274.8 15882. .. | | 26 | LINESTRING[30291.6 15918.2,30291.6 15934.4,30275 15934.4, .. | | 249 | LINESTRING[30337.8 15938.6,30337.8 15946.8,30320.4 15946. .. | | 1 | LINESTRING[30250.4 15129.2,30248.8 15138.4,30238.2 15136. .. | | 2 | LINESTRING[30220.2 15122.8,30217.2 15137.8,30207.6 15136, .. | | 3 | LINESTRING[30179 15114.4,30176.6 15129.4,30167 15128,3016 .. | | 4 | LINESTRING[30155.2 15121.4,30140.4 15118.6,30142 15109,30 .. | | 5 | LINESTRING[30192.4 15085,30177.6 15082.2,30179.2 15072.4, .. | | 6 | LINESTRING[30244 15087,30229 15086.2,30229.4 15076.4,3024 .. | | 7 | LINESTRING[30200.6 15059.4,30185.6 15058.6,30186 15048.8, .. | | 10 | LINESTRING[30179.6 15017.8,30181 15002.8,30190.8 15003.6, .. | | 11 | LINESTRING[30154.2 15000.4,30168.6 15004.8,30166 15014.2, .. | | 13 | LINESTRING[30105 15065.8,30108.4 15050.8,30118 15053,3011 .. | | 154 | LINESTRING[30276.2 15143.8,30261.4 15141,30263 15131.4,30 .. | | 155 | LINESTRING[30269.8 15084,30269.4 15093.4,30258.6 15093,30 .. | | 157 | LINESTRING[30128.2 15011,30113.2 15010.2,30113.6 15000.4, .. | +-----+---------------------------------------------------------------+ 20 rows in set [0.00 sec]
Sử dụng
DROP INDEX sp_index ON geom;2 để kiểm tra cách thực hiện truy vấn này
mysql>SET @poly =
->'Polygon[[30000 15000,31000 15000,31000 16000,30000 16000,30000 15000]]';
mysql>EXPLAIN SELECT fid,AsText[g] FROM geom WHERE
->MBRContains[GeomFromText[@poly],g]\G
*************************** 1. row *************************** id: 1 select_type: SIMPLE table: geom type: range possible_keys: g key: g key_len: 32 ref: NULL rows: 50 Extra: Using where 1 row in set [0.00 sec]
Kiểm tra điều gì sẽ xảy ra nếu không có chỉ mục không gian
mysql>SET @poly =
->'Polygon[[30000 15000,31000 15000,31000 16000,30000 16000,30000 15000]]';
mysql>EXPLAIN SELECT fid,AsText[g] FROM g IGNORE INDEX [g] WHERE
->MBRContains[GeomFromText[@poly],g]\G
*************************** 1. row *************************** id: 1 select_type: SIMPLE table: geom type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 32376 Extra: Using where 1 row in set [0.00 sec]
Việc thực thi câu lệnh
DROP INDEX sp_index ON geom;3 mà không có chỉ mục không gian mang lại kết quả tương tự nhưng khiến thời gian thực hiện tăng từ 0. 00 giây đến 0. 46 giây