내가 실행하는 사이트는 많은 수의 검색을 수행합니다. 이러한 검색은 중요하지 않으며 결과에 합류해야하는 여러 데이터가 있습니다. 검색어 및의 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 초 정도의 평균 쿼리 시간이 소요됩니다. 이 시간 동안 성능이 다시 저하되고 다시 정사각형으로 돌아갑니다. 이것을 작성하는 더 좋은 방법이 있습니까? 아니면 이것을 설계하는 더 좋은 방법일까요?
감사합니다.
주기적으로 정의 할 수 있습니까? 매일 밤 2시에 30 초가 걸린다는 것을 의미합니까? 하루 동안 그렇게한다면 야간에만 할 수 있습니까? 쿼리를 향상 시키려면 조인으로 변환 할 수 있습니다. 'not in'은 테이블에 크기가 있으면 불쾌 할 수 있습니다. – Ben
10 분마다 검색이 유효하지 않습니다. 검색은 일반적으로 정리되기 전에 ~ 5k 행을가집니다. 각 검색은 일반적으로 ~ 1k와 ~ 20k 결과가 검색 결과에 저장됩니다. 따라서 오래된 결과를 제거하는 것은 상당히 중요합니다. – bmancini