【发布时间】:2012-01-04 21:12:16
【问题描述】:
我有两张表:一张是点,另一张是多边形。
CREATE TABLE `points` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`point` point NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
CREATE TABLE `ranges` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`poly` polygon NOT NULL,
PRIMARY KEY (`id`),
SPATIAL KEY `poly` (`poly`)
) ENGINE=MyISAM;
我想将范围连接到多边形内点上的点。查询看起来很简单:
SELECT *
FROM points
LEFT JOIN ranges
ON MBRCONTAINS(poly, point)
WHERE points.id = 2;
这个查询运行速度很快并且使用索引,解释的一部分:
表 |类型 |可能的键 |关键 | key_len 范围 |范围 |聚 |聚 | 34
但是,当我尝试加入表 points 中的几行时:
SELECT *
FROM points
LEFT JOIN ranges
ON MBRCONTAINS(poly, point)
WHERE points.id IN (1,2,3);
一切都崩溃了:
+----+-------------+------------+-------+--- ------------+---------+---------+------+--------+- ------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+------------+-------+--------- ------+---------+----------+------+--------+------- ------+ | 1 |简单 |积分 |范围 |初级 |初级 | 4 |空 | 3 |使用位置 | | 1 |简单 |范围 |全部 |聚 |空 |空 |空 | 155183 | | +----+-------------+------------+-------+--------- ------+---------+----------+------+--------+------- ------+
添加FORCE INDEX (poly) 没有帮助。
测试查询的样本数据(对不起,只有php版本,我不常用SQL程序):
//points
for($i=0;$i<=500;$i++) {
$point = mt_rand();
mysql_query('INSERT INTO points (point) VALUES (POINTFROMWKB(POINT('.$point.', 0)))');
}
$qty = 20000;
$max = mt_getrandmax();
$add = $max / $qty
$end = 0;
//polys
while($end < $max) {
$start = $end;
$end = mt_rand($start, $start + $add);
mysql_query('INSERT INTO ranges (poly) VALUES (
GEOMFROMWKB(POLYGON(LINESTRING(
POINT('.$start.', -1),
POINT('.$end.', -1),
POINT('.$end.', 1),
POINT('.$start.', 1),
POINT('.$start.', -1)
)))
)');
}
【问题讨论】:
-
您能解释一下“一切都崩溃了”是什么意思吗?错误信息难以阅读?!
-
您能否为这些表发布一个示例插入,您是否尝试重写该 IN 条件以使用联接?
-
@David 'everthing wrong' - 查询不使用索引。
-
@Pentium10 我将在几个小时内制作样本插入。我可以用'points.id
标签: mysql optimization indexing geospatial