0

我不明白这一点。我已经多次删除表并重新创建它,每次都是一样的。当我运行此查询时:

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 认为一次只删除一行是合适的。我不会点击 'Go' 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 上运行。有任何想法吗?

4

2 回答 2

0

尝试优化您的方格。

编辑:或添加限制:

DELETE FROM `squares` WHERE MBRContains(PolyFromText('Polygon((-42 175, -42 179, -48 179,     -48 175, -42 175))'), `coordinate`) LIMIT 10000;

如果可以,请使用 limit 参数。

于 2013-08-18T21:42:55.163 回答
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 进行测试,将 DELETE 关键字替换为 SELECT。)

这并没有回答为什么会发生这种情况的问题(MBRContainsPolyFromText函数的行为有什么特殊之处?)但它是一种可能的解决方法。内联视图中的 SELECT 应具体化为派生表(临时 MyISAM 表),然后删除应针对该表起作用。(类似于创建一个临时表,将 SELECT 的结果插入其中,然后在另一个查询中引用该表。)

于 2013-08-18T22:23:02.500 回答