我不明白这一点。我已经放弃了桌子并重新创建了多次,每次都是这样。当我运行此查询时:
SELECT * FROM `squares` WHERE MBRContains(PolyFromText('Polygon((-34 166, -34 171, -41 171, -41 166, -34 166))'), `coordinate`);
我返回了250,000多个结果,这是正确的。当我尝试根据我的where子句更改查询以删除它时,如下所示:
DELETE FROM `squares` WHERE MBRContains(PolyFromText('Polygon((-34 166, -34 171, -41 171, -41 166, -34 166))'), `coordinate`);
MySQL认为一次只能删除一行。我不打算点击'去'250K +次。为什么是这样?这是表结构......
`squares` (
`square_id` int(7) unsigned NOT NULL,
`ref_coord_lat` double(8,6) NOT NULL,
`ref_coord_long` double(9,6) NOT NULL,
`coordinate` point NOT NULL,
PRIMARY KEY (`square_id`),
KEY `ref_coord_lat` (`ref_coord_lat`),
KEY `ref_coord_long` (`ref_coord_long`),
SPATIAL `coordinate` (`coordinate`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
如果它有用,这是MySQL 5.5.27,在phpMyAdmin 3.5.2.2上运行。有什么想法吗?
答案 0 :(得分:0)
尝试优化表格方块。
编辑: 或者添加限制:
DELETE FROM `squares` WHERE MBRContains(PolyFromText('Polygon((-42 175, -42 179, -48 179, -48 175, -42 175))'), `coordinate`) LIMIT 10000;
如果可以的话,使用限制参数进行播放。
答案 1 :(得分:0)
这种行为让我非常奇怪,(如果客户端没有在LIMIT 1子句中滑入DELETE查询。)
我可以建议一个解决方法。使用返回250K +行的SELECT查询,并将其用作内联视图,并连接回表以执行删除。
DELETE t.*
FROM `squares` t
JOIN ( SELECT s.square_id
FROM `squares` s
WHERE MBRContains(
PolyFromText(
'Polygon((-34 166, -34 171, -41 171, -41 166, -34 166))'
)
, s.`coordinate`
)
) s
ON s.square_id = t.square_id
(首先将其作为SELECT测试,用SELECT替换DELETE关键字。)
这不能回答为什么会发生这种情况的问题(MBRContains
或PolyFromText
函数的行为特有的东西?)但它可能是一种解决方法。内联视图中的SELECT应该具体化为派生表(临时MyISAM表),然后删除应该对此起作用。 (类似于创建临时表,将SELECT中的结果插入其中,然后在另一个查询中引用该表。)