2011-03-28 5 views
1
DELETE FROM table WHERE uniqueField = 1 

MySQL이 uniqueField = 1으로 행을 찾으면 삭제합니다. 그런 다음 고유 한 필드에 값이 1 인 행 하나만 있기 때문에 다른 행을 확인하지 않습니까?조건이있는 테이블에서 행 삭제 uniqueField = 1

또는 MySQL은이 uniqueField = 1있는 행을 발견 한 후에도 계속 검색 할 것인가?

답변

4

uniqueFieldUNIQUE을 선언하는 경우는, 암시 적 인덱스는 고유 제한 조건을 단속하기 위해 작성됩니다.

MySQL 아마 대부분 삭제 기록을 찾기 위해이 인덱스를 사용합니다. 이 인덱스는 UNIQUE되기 때문에

, 엔진은 하나 개의 기록을 검색합니다. 필드가 인덱스의 고유 선언하지하지 않을 경우

, 다음 MySQL이 필드의 값을 확인하기 위해 모든 레코드를 스캔해야합니다.

3

조치는 색인의 존재 여부 및 색인 유형에 따라 다릅니다.

uniqueField가 UNIQUE 색인의 일부인 경우 MySQL은 색인을 사용하여 일치하는 행을 찾아 최대 하나의 행으로 만들 수 있습니다.

uniqueField가 INDEX 고유하지 않은 색인의 일부인 경우 색인을 사용하여 0, 1 이상일 수있는 일치하는 행을 찾고 삭제할 수 있습니다. uniqueField 어떤 인덱스의 일부가 아닌 경우

, 그것은 전체 테이블을 스캔해야합니다, 전면 백업합니다. 한 행을 찾더라도 끝날 때까지 계속해서 테이블을 스캔합니다.

MySQL은 의 확장자를 LIMIT 절과 함께 지원하며이 옵션을 사용하여 쿼리를 최적화 할 수 있습니다. 첫 번째 삭제 후 중지되고 끝까지 스캔되지 않습니다. 마스터와 슬레이브의 행 순서가 반드시 동일하지는 않습니다 (즉, 마스터와 슬레이브의 다른 행을 삭제하여 데이터 분기가 발생할 수 있으므로 복제되지 않습니다).

다음을 사용할 수 있습니다. DELETELIMITORDER BY으로 설정하면 정렬 비용이 추가로 DELETE FROM sometable WHERE uniqueField = 1 ORDER BY id LIMIT 1이되므로 복제가 안전합니다.

또는 SELECT id FROM sometable WHERE uniqueField = 1을 먼저 생성 한 다음 ID 목록과 DELETE FROM sometable WHERE id IN (...)을 만들면 복제 안전이 보장됩니다.

+0

마지막 제안에있는'SELECT'와'DELETE'는 하나의 쿼리로 결합 가능해야합니다 ... – jswolf19

+0

예, 그렇습니다. MySQL 옵티마이 저가 DELETE ... WHERE f IN (SELECT ...)을 DELETE ... WHERE f IN (const, const, const, ...)와 다르게 취급합니다. 날 시작하지 마라. 마지막으로 MariaDB 5.3으로 업그레이드하기 전에 WHERE ... IN (...) 절에서 하위 쿼리를 사용하지 마십시오. – Isotopp

+0

대신에'EXISTS'를 사용하는 것이 목적을 이겨내는 것 같아요. ^^ – jswolf19

관련 문제