2010-08-07 4 views
10

저는 MySQL을 사용하는 전자 상거래 응용 프로그램을 가지고 있습니다. 이전에 액세스 한 웹 사이트에서 부품 #을 액세스하면 필요한 모든 데이터가 이미 INNODB 버퍼 풀에 있으므로 부품이 빠르게로드됩니다. 그러나 파트 #이 한번도로드되지 않은 경우 해당 데이터는 아직 버퍼 풀에 없으므로 디스크에서 읽어야하므로 속도가 느립니다. INNODB 버퍼 풀을 2GB로 설정 했으므로이 전체 데이터베이스는 약 350MB 밖에되지 않으므로 버퍼 풀에 전체 데이터베이스를로드 할 여지는 충분합니다. INNODB 통계에서 버퍼 풀의 약 절반 만 사용된다는 것을 알 수 있습니다.MySQL을 사용하여 INNODB 버퍼 풀에 테이블을 미리로드하는 방법은 무엇입니까?

Quickly preloading Innodb tables in the buffer pool 또는 mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole과 같이 버퍼 풀을 예열하는 것으로 알려진 데이터를 미리로드하는 것에 대한 참조를 발견했습니다. .html. 이 전략은 기본적으로 MySQL에 데이터를 미리로드 할 수있는 기본 방법이 없으므로 각 테이블에서 테이블 검색을 강제 실행하는 작업을 포함합니다.

데이터베이스의 모든 단일 테이블을 나열하고이를 수행해야하는 스크립트를 수동으로 만들고 싶지 않습니다. 어떻게 자동으로 각 테이블에 대해 select를 수행하고 자동으로 스크립트를 작성하고 인덱스 스캔되지 않은 열을 자동으로 선택하여 테이블 스캔이 수행됩니까?

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name' 

를 그런 다음 각 테이블 이름 힘 테이블 스캔 : 사용자가 수동으로 입력 그들에게 필요가 없습니다

답변

0

이 쿼리는 데이터베이스의 테이블 이름을 반환합니다.

22

이 당신에게 실행하는 쿼리의 목록을 제공해야한다)

SELECT 
    CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL') 
FROM 
    information_schema.COLUMNS AS c 
LEFT JOIN (
    SELECT DISTINCT 
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME 
    FROM 
    information_schema.KEY_COLUMN_USAGE 
) AS k 
USING 
    (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) 
WHERE 
    c.TABLE_SCHEMA = 'yourDatabase' 
    AND k.COLUMN_NAME IS NULL 
GROUP BY 
    c.TABLE_NAME 

당신은 저장 프로 시저에 넣어, 그리고 커서 결과 집합을 통해 갈 수 있습니다. 각 행에서 준비된 명령문을 작성하고 실행하십시오.

+3

이 알고리즘은 간단하고 명쾌합니다. 그러면 innodb 데이터가 캐시됩니다. 이 캐시가 모든 innodb 인덱스 페이지를 캐시 할 지 확신 할 수 없지만 알고리즘을 빠르게 적용 할 수 있습니다. MyISAM은 MYI 색인 페이지 만 캐시합니다. 다시 말하지만 알고리즘은 테이블과 인덱스를 통과하는 기초를 형성합니다. 브라보 (그리고 +1) !!!! – RolandoMySQLDBA

+1

Mine은 쿼리 목록을 가져 오기위한 구현 방법입니다. 아이디어는 MySQL의 성능 블로그에서 질문에 링크에서 비롯됩니다. – Mchl

관련 문제