使用空间键和边界框的初始慢查询

时间:2013-11-01 21:38:46

标签: mysql

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

0 个答案:

没有答案