2009-03-23 4 views
5

현재 MyISAM 테이블에 대해 집중적 인 SELECT 쿼리를 실행하고 있습니다. 이 테이블은 약 100 MiB (800,000 행)이며 결코 변경되지 않습니다.MySQL의 MEMORY 스토리지 엔진에 대한 대안

필자는 스크립트의 성능을 향상시켜야 테이블을 MyISAM에서 MEMORY 스토리지 엔진으로 옮겨서 메모리에 완전히로드 할 수 있다고 생각했습니다.

MEMORY 스토리지 엔진 외에도 메모리에 100 MiB 테이블을로드하는 옵션은 무엇입니까?

+0

테이블에 'SHOW CREATE TABLE'을 실행하고 테이블 구조와 인덱스를 볼 수 있도록 결과를 게시하십시오 . 일부 샘플 SELECT 쿼리는 훌륭해야합니다. –

+0

http://dba.stackexchange.com/questions/1811/what-are-reasons-not-to-use-the-memory-storage-engine-in-mysql – zloctb

답변

4

사용중인 스토리지 엔진에 관계없이 800k 행의 테이블은 mysql에 아무런 문제가 없어야합니다. 100MB 크기의 전체 테이블 (데이터 및 키)은 메모리에 있어야합니다 (mysql 키 캐시, OS 파일 캐시 또는 적절하게 둘 다).

먼저 색인을 확인하십시오. 대부분의 경우 인덱스를 최적화하면 성능이 향상됩니다. 당신이 그들이 모양에 있음을 확신하지 않는다면, 다른 것을하지 마십시오. EXPLAIN을 사용하여 쿼리를 실행하고 잘못된 인덱스가 사용 된 경우를 살펴보십시오.이것은 테스트 데이터가있는 서버가 아닌 실제 데이터로 수행되어야합니다.

인덱스를 최적화 한 후에는 쿼리가 1 초 단위로 완료되어야합니다. 쿼리가 너무 느린 경우 응용 프로그램의 캐시 (memcached 등)를 사용하여 쿼리를 실행하지 마십시오. 테이블의 데이터가 변경되지 않는다면 오래된 캐시 데이터 등에 문제가 있어서는 안됩니다.

0

데이터가 거의 변경되지 않는다고 가정하면 MySql query caching을 사용하여 쿼리 성능을 크게 향상시킬 수 있습니다.

+1

나는 memcache와 다른 캐시 솔루션을 찾고 있었는데, 그러나 쿼리 캐싱의 문제는 거의 동일한 쿼리가 아니라는 것입니다. 대부분의 경우에는 한 번만 호출되는 쿼리가 다릅니다. –

0

테이블에 많은 쿼리가있는 경우 서버에있는 메모리 양에 따라 운영 체제 수준에서 캐시 된 것일 수 있습니다.

MyISAM은 MyISAM Key Cache이라는 메커니즘을 사용하여 MyISAM 테이블 인덱스를 메모리에 미리로드 할 수 있습니다. 키 캐시를 생성 한 후 CACHE INDEX 또는 LOAD INDEX 구문을 사용하여 캐시에 색인을로드 할 수 있습니다.

테이블과 쿼리를 분석하고 실제 쿼리 후 색인을 최적화했다고 가정합니다. 그렇지 않으면 전체 테이블을 메모리에 저장하려고하기 전에해야 할 일입니다.

+0

나는 이미 테이블과 쿼리를 최적화했다. SELECT를 테이블 열 이름 = '검색 매개 변수'FROM : ID 이름 LASTNAME 연령 성별 거리 번호 도시 국가 ... 그리고 내 쿼리의 대부분은 다음과 같이 : 내 테이블 구조는 다음과 유사한입니다 –

0

InnoDB 버퍼 풀에서 또는 MyIsam에서 사용할 수 있도록 메모리를 할당하는 데 충분한 메모리가있는 경우 데이터베이스를 메모리로 읽어 들일 수 있습니다 ('SELECT * from tablename'). 제거 할 이유가없는 경우 그것은 거기에 머물러 있습니다.

MEMORY 테이블은 작은 bsree 액세스가 아닌 해시 - 바스 (hash-bashed) 키만 사용하기 때문에 키가 더 잘 사용됩니다. .

평상시처럼 벤치마킹을하는 것이 가장 좋습니다.

v5.1을 사용하는 경우 압축이 가능한 ARCHIVE 테이블 유형을 사용하고 쉽게 압축 할 수있는 경우 내용에 대한 액세스 속도를 높일 수 있다는 또 다른 아이디어가 있습니다. 이렇게하면 CPU 시간이 스와핑되어 IO/메모리 액세스에 대한 압축이 해제됩니다.

0

데이터가 변경되지 않으면 테이블을 여러 데이터베이스 서버에 쉽게 복제 할 수 있습니다.

이 방법을 사용하면 다른 서버로 쿼리를 수행 할 수 있으므로 주 서버에 약간의 호흡 공간이 확보됩니다.

속도 향상은 현재 데이터베이스로드에 따라 다르며 데이터베이스로드가 매우 낮은 경우에는 개선되지 않습니다.

추 신 :
데이터베이스가 다시 시작될 때 MEMORY 테이블의 내용을 잊어 버린 것을 알고 있습니다!