这是我向 SO 提出的第一个问题,所以如果我遗漏了任何内容,请善待。
此示例查询是搜索德克萨斯州达拉斯 30 英里范围内的汽车。我正在使用边界框来限制要搜索的行。
问题:
在缓存查询之前,检索 23,600 个结果大约需要 20 秒。看起来在边界框内只有 411 行要搜索。这不应该真的很快吗?
关于为什么这么慢的任何想法?关于如何改善这一点的任何建议?难道我做错了什么?
查询:
SELECT Make, Model
FROM cars
WHERE MBRCONTAINS( GEOMFROMTEXT( 'Polygon(( 32.4800138808 -97.1620371512, 33.0933687128 -97.1620371512, 33.0933687128 -96.4324293136,
32.4800138808 -96.4324293136, 32.4800138808 -97.1620371512 ))' ) ,g )
解释输出:
+----+-------------+---------+-------+---------------+------+---------+------+------+------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+------+---------+------+------+-----
| 1 | SIMPLE | carscom | range | g | g | 34 | NULL | 411 | Using where |
+----+-------------+---------+-------+---------------+------+---------+------+------+------
此表中有大约 120 万行。
这是具有相关列和索引的表结构。实际的表有更多的列和更多的索引。
CREATE TABLE IF NOT EXISTS `cars` (
`Latitude` float(10,7) NOT NULL,
`Longitude` float(10,7) NOT NULL,
`Make` varchar(20) NOT NULL,
`Model` varchar(50) NOT NULL,
`g` geometry NOT NULL,
KEY `LatLon` (`Latitude`,`Longitude`),
SPATIAL KEY `g` (`g`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
column 上有一个空间键g
。
这是填充g
列并在其上放置空间索引的 SQL。
UPDATE `cars` SET `g` = GeomFromText(CONCAT('POINT(',`Latitude`,' ',`Longitude`,')'));
ALTER TABLE `cars` ADD SPATIAL KEY `g` (`g`);
我不明白为什么最初只搜索 411 行需要这么长时间。空间列和键有问题吗?
谢谢你的帮助。
更新:MySQL 服务器是 5.1.70,服务器有 16GB 内存。我还编辑了 my.cnf 文件以包含 skip-host-cache 和 skip-name-resolve 并重新启动 MySQL 服务器。
更新 2,个人资料信息:
Starting 7 µs
Checking Query Cache For Query 42 µs
Checking Permissions 2 µs
Opening Tables 8 µs
System Lock 2 µs
Table Lock 5 µs
Init 15 µs
Optimizing 5 µs
Statistics 39 µs
Preparing 13 µs
Executing 2 µs
Sending Data 163 µs
End 3 µs
Query End 1 µs
Freeing Items 15 µs
Logging Slow Query 1 µs
Cleaning Up 2 µs