MySQL select查询返回250K +结果,删除查询只删除一个?

时间:2013-08-18 21:27:48

标签: mysql sql myisam

我不明白这一点。我已经放弃了桌子并重新创建了多次,每次都是这样。当我运行此查询时:

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上运行。有什么想法吗?

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关键字。)

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