2011-08-02 1 views
0

나는 20 백만 레코드에 가까운 테이블을 보유하고 있습니다. 테이블은 innodb로 설정되었습니다. 두 가지 주요 분야의 주요 지수가 :optomise 매우 큰 테이블 쿼리

`entries_to_fields` 
entry_id int(11) NO PRI NULL  
field_id int(11) NO PRI NULL  
value text NO  NULL  

레코드의 수에도 불구하고는,이 테이블에 쿼리의 대부분은 다음을 제외하고 매우 빠르다이 모두 삭제

DELETE FROM `entries_to_fields` WHERE `entry_id` IN (SELECT `id` FROM `entries` WHERE `form_id` = 196) 

특정 양식에 대한 입력 데이터.

현재 엔트리 테이블이 결과를 반환하지 않더라도 45 초 이상 걸립니다.

내 질문에 내가 할 수있는 entries_to_fields 구조에 대한 간단한 변경이있을 수 있습니까, 아니면 내 질문을 더 자세히 분석 할 수 있습니까?

답변

3

답변을 읽은 후에 (나중에) 잘 도움이 될 수있는이 쿼리를 작성했습니다.

DELETE entries_to_fields 
FROM entries_to_fields 
JOIN entries 
ON entries_to_fields.entry_id = entries.id 
WHERE entries.form_id = 196 

... entries.form_id 필드의 색인을 생성해야합니다.

+0

감사합니다! 나는 당신이 삭제 내면 조인을 가질 수 있다는 것을 몰랐습니다 .. 매일 새로운 것을 배우십시오! –

1

& 오류 + 검색 후 큰 테이블의 인덱스 필드에 IN을 사용하는 것이 매우 나쁜 습관임을 알게되었습니다. 잠재적 인 큰 쿼리를 생성에도 불구하고

DELETE FROM `entries_to_fields` WHERE `entry_id` = 232 OR `entry_id` = 342 ... 

, 이것은 지금 ~ 1 초 내에서 실행 다음과 같이 그때 별도의 쿼리에 하위 쿼리를 파괴하고 한

은 동적 쿼리를 만들었습니다. 항목을 1000 개 삭제할 때도 마찬가지입니다.