2012-01-12 3 views
0

나는이 필드를mysql에서 NOT IN 구문을 사용하면 DB 서버가 중단되는 이유는 무엇입니까?

테이블 이름을 가진 두 개의 MySQL의 테이블 하나가 - residential : 차 ListingID 키와 ListingStatus에 인덱스와

ListingID varchar(12), 
ListingStatus varchar(15) 

합니다.

또 다른 테이블 - mlscheck : 상태에 대한 MLS 및인데 스에 동일한 기본 키

mls varchar(12), 
status varchar(15) 

. 심지어

delete from residential 
where ListingStatus = "Active" and 
ListingID NOT IN(select mls from mlscheck where status = "Active") 

:

delete from residential 
where ListingStatus = "Active" 
    and LIstingID NOT IN(select mls from mlscheck) 

도 작품을 모두 내 데이터베이스를 충돌하고 나는 다시 시작해야

내가 좋아하는 아무것도 할 때.

조인, 유니온 등을 사용하는 방법을 배우고 싶습니까? 나는 괜찮은 명령이 아니라고 생각했다. 전문가 중 일부로부터 의견을 얻을 수 있습니까?

성능에
+0

테이블에 몇 개의 레코드가 있습니까? –

+0

작은 따옴표 (예 : '활성')를 사용해 보셨습니까? 또한 일반적으로 95 % 고유하지 않으면 열을 인덱싱하지 마십시오. 옵티마이 저는 인덱스를 무시하고 불필요한 오버 헤드가 발생합니다. –

+0

1. 무거운 짐이라도 충돌해서는 안됩니다. 이것은 DB입니다. 2. 다른 메모리/디스크 공간 문제가 있는지 확인하십시오. 3. 기본 사항 기본 사항 mysql 로그를 확인 했습니까? –

답변

0

더 나은 항상 조인 또는 서브 쿼리보다 동일

이 쿼리 서버에 대한 무거운, 느릅 나무 mls의 모든 행을 선택해야하며, residential

의 각 행이 그 이유 데이터베이스를 추락. 사용하여

조인 :

DELETE r FROM residential r 
LEFT JOIN mlscheck 
    ON mls = ListingID 
WHERE ListingStatus = "Active" 
    AND mls IS NULL 

residential 행이 삭제됩니다. (해당 r) mls 행 해당하는 찾을 때.

+0

댕! 너희들은 너무 빠르다. 't – retsman

+0

미안하지만 주거용 테이블 170,000 행 rowlength 3,209 및 rowsizes 3268 mlscheck 테이블에 약 350 필드에만 2 필드, 총 행, 43,000 정도 있다는 것을 잊어 버렸습니다. 그리고 나는 95 % 고유하지 않은 것들로부터 색인을 취합니다. – retsman

0

NOT IN 연산자는 큰 레코드가있는 테이블의 경우 비용이 많이들 수 있습니다. 테이블 이름으로 판단하면 큰 데이터 세트 인 MLS 목록으로 무언가를하려고합니다. 당신이 할 수있는 일

청크에 의해 삭제 덩어리를 수행하는 스크립트를 작성하는 것입니다 : 주거에서 삭제

어디 ListingStatus = "활성"및 NOT IN ListingID (선택 MLS mlscheck에서 어디 상태 = " 활성 "LIMIT 0, 100)

주거 어디에서 삭제 ListingStatus ="활성 "및 ListingID 곳 ListingStatus ="활성 " mlscheck에서와 ListingID NOT IN (선택 MLS 어디 상태 ="활성 "LIMIT 101, 200)

주거 어디에서 삭제 "활성"ListingStatus = 및 ListingID 여기서 "활성"ListingStatus = 및 ListingID NOT IN ( mlscheck에서 선택 MLS 어디 상태 = "활성"LIMIT 201, 300)

BAK에서 ​​언급 한 JOIN 방식을 사용하지 않으려는 경우입니다.

+0

예, 주거용 테이블에는 약 114,000 개의 레코드 만 있지만 350 개의 필드가 있습니다. 고유하지 않은 경우 색인이 간과된다는 사실을 알지 못했습니다. 감사합니다. 조인 예제가 있습니까? 큰 소년들까지 올라갈 수 있습니다. – retsman

+0

헤이 녀석들, 좀 바보 같아서 새로 만든 테이블 mlscheck가 스웨덴 라틴어의 문자 세트로 만들어 졌거나 다른 모든 테이블이 문자 집합 utf8 인 것으로 나타났습니다. 모든 것이 훌륭하게 작동합니다. 하지만 오버 헤드에 대해 배웠고, 다음 번에 저장할 조인을 고맙게 생각합니다. 고마워. – retsman

관련 문제