私は2つのテーブルを持っています:1つはポイント、もう1つはpolysです。空間的なmysqlインデックスの結合
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;
ポリゴンの点のポイントに範囲を結合したいと考えています。クエリはシンプルに見える:私はテーブルpoints
からいくつかの行に参加しようとすると、
:しかし
SELECT *
FROM points
LEFT JOIN ranges
ON MBRCONTAINS(poly, point)
WHERE points.id = 2;
このクエリは、高速で動作し、インデックスを使用し、説明の一部
SELECT *
FROM points
LEFT JOIN ranges
ON MBRCONTAINS(poly, point)
WHERE points.id IN (1,2,3);
すべてが故障する:
+----+-------------+------------+-------+---------------+---------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+-------+---------------+---------+---------+------+--------+-------------+ | 1 | SIMPLE | points | range | PRIMARY | PRIMARY | 4 | NULL | 3 | Using where | | 1 | SIMPLE | ranges | ALL | poly | NULL | NULL | NULL | 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)
)))
)');
}
http://dba.stackexchange.com/? –
「永遠に崩壊する」ということは何を意味するのか説明できますか?エラーメッセージは読みにくいですか? – Bytemain
これらのテーブルのサンプルを挿入するのは親切でしょうか?また、その結合条件を使用するためにそのIN条件を書き直そうとしましたか? – Pentium10