2011-10-10 2 views
2

내가 실행하는 사이트는 많은 수의 검색을 수행합니다. 이러한 검색은 중요하지 않으며 결과에 합류해야하는 여러 데이터가 있습니다. 검색어 및의 SearchResult쿼리를 information_schema로 최적화

검색하는

의 SearchResult 두 열 idsearch 포함 된 검색은 메타 데이터를 포함 iddata 및 메모리 테이블

에 있습니다

내 용액 두 테이블에 검색 결과를 저장하는 것이었다 검색 결과의 메모리 오버플로를 방지하기 위해이 테이블을 주기적으로 제거하고 오래된 데이터를 플러시합니다. 내가 아는 한, 메모리 테이블은 테이블 수준 잠금을 가지므로 정리 중에 검색 결과 테이블이 차단되어 사이트 성능이 저하됩니다.

해결책은 각 검색에 대해 새 테이블을 만든 다음 검색이 오래되면이 searchresults_xxxx 테이블을 삭제하는 것입니다.

검색 테이블에서 오래된 부실 항목을 먼저 삭제하면됩니다. 다음을 실행하십시오 :

select table_name 
from information_schema.tables 
where 
    table_schema = 'mysite_datawarehouse' 
    and table_name not in (select concat('searchresults_', idsearch) from searches); 

종종 수천 건의 일치가 발생하여 약 30 초 정도의 평균 쿼리 시간이 소요됩니다. 이 시간 동안 성능이 다시 저하되고 다시 정사각형으로 돌아갑니다. 이것을 작성하는 더 좋은 방법이 있습니까? 아니면 이것을 설계하는 더 좋은 방법일까요?

감사합니다.

+0

주기적으로 정의 할 수 있습니까? 매일 밤 2시에 30 초가 걸린다는 것을 의미합니까? 하루 동안 그렇게한다면 야간에만 할 수 있습니까? 쿼리를 향상 시키려면 조인으로 변환 할 수 있습니다. 'not in'은 테이블에 크기가 있으면 불쾌 할 수 있습니다. – Ben

+0

10 분마다 검색이 유효하지 않습니다. 검색은 일반적으로 정리되기 전에 ~ 5k 행을가집니다. 각 검색은 일반적으로 ~ 1k와 ~ 20k 결과가 검색 결과에 저장됩니다. 따라서 오래된 결과를 제거하는 것은 상당히 중요합니다. – bmancini

답변

0

방금 ​​관련 질문 : Slow query on information_schema.tables을 요청하여 해결했습니다. 여기서 문제는 * .FRM 파일에 대한 디렉터리 검색을 수행하여 쿼리가 데이터 디렉터리의 모든 테이블을 열거한다는 것입니다. 또한 모든 FRM 파일을 열어 헤더를 읽을 수도 있습니다. 이것은 느려질 것입니다.

My Q가 정보 스키마를 전혀 쿼리하지 않는 이유는 무엇입니까? 나는 당신이 수색의 내용을 신뢰 한 ㄴ다고 추정한다. 에 생성 타임 스탬프 필드를 포함하고 검색 시간이 인 것을 포함하고 생성 시간 스탬프가 특정 나이보다 오래된 모든 테이블 이름을 선택하는 것만 큼 좋습니다. 그런 다음 드롭 테이블이있는 경우 루프를 수행하고이 정리 프로세스를 저장 프로 시저로 옮깁니다. 정보 스키마에서 기본 쿼리를 수행하면 아무 것도 추가되지 않고 자르기 프로세스가 느려집니다. 여기

0

내가 쉽게 InnoDB 테이블의 무리가 다음과 같이 조인 LEFT을 수행 할 수

시도를 통해 리팩토링 쿼리 쿼리를 탐색 할 수있는 경우가 느린 것으로 기대

select table_name 
from information_schema.tables 
where 
    table_schema = 'mysite_datawarehouse' 
    and table_name not in 
    (select concat('searchresults_', idsearch) from searches); 

원래 쿼리 당신에게있다 :

select A.table_name 
from (select concat('searchresults_', idsearch) table_name from searches) A 
LEFT JOIN 
(select table_name FROM information_schema.tables 
where table_schema = 'mysite_datawarehouse') B 
USING (table_name) 
WHERE B.table_name IS NULL; 
관련 문제