2013-08-18 7 views
0

나는 이것을 이해하지 못한다. 나는 테이블을 떨어 뜨 렸으며 여러 번 다시 만들었고 매번 똑같습니다. 다음 쿼리를 실행할 때MySQL 선택 쿼리는 250K + 결과를 반환하고, 삭제 쿼리는 하나만 삭제합니다.

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 to 250K + times를 클릭하지 않을 것이다. 왜 이런거야? 다음은 테이블 구조입니다 ...

어떤 용도로 사용하는 경우, 이것은 phpMyAdmin 3.5.2.2에서 실행되는 MySQL 5.5.27입니다. 어떤 아이디어?

+0

mysql 클라이언트는 무엇입니까? – Mihai

+0

@ 미하이,이게 무슨 뜻이야? '데이터베이스 클라이언트 버전 : libmysql - mysqlnd 5.0.10 - 20111026' – ReactingToAngularVues

+0

나는 phpmyadmin, mysql workbench 등을 의미합니까? – Mihai

답변

0

표 사각형을 최적화하십시오.

편집 : 또는 제한 추가 제한 매개 변수를

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

플레이 할 수 있다면합니다. 행동이 매우 이상한 인상을 받았는데 그건

+0

최적화되어 제한이 추가되었습니다. 여전히 차이는 없습니다. – ReactingToAngularVues

0

(클라이언트가 DELETE 쿼리에 LIMIT 1 절에 미끄러지는되지 않습니다.) 내가 해결 방법을 제안 할 수

. 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 첫번째로 테스트합니다.)

이것은 MBRContains 또는 PolyFromText의 행동과 독특한 무엇인가 (왜 이런 일의 질문에 대답하지 않습니다 기능?) 그러나 가능한 해결책. 인라인 뷰의 SELECT는 파생 테이블 (임시 MyISAM 테이블)로 구체화되어야하며 삭제는이를 처리해야합니다. (임시 테이블을 생성하고 SELECT의 결과를 삽입 한 다음 다른 쿼리에서 테이블을 참조하는 것과 비슷합니다.)