0

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

0 回答 0