这是我向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;
列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