데이터 읽기를위한 MyISAM


10

약 10 억 행의 테이블이 있으며 98 % 읽기 집중적입니다.

다른 스토리지 엔진 (MyISAM 및 InnoDB)을 사용하여 데이터베이스 튜닝을 시도했습니다.

그런 다음 성능을 확인하기 위해 몇 가지 테스트를 실행했습니다.

where 절에서 기본 키 ID가 있었고 MyISAM Key Cache 저장소가 버퍼에 모든 인덱스를로드하기 때문에 MyISAM을 사용하면 InnoDB보다 약 2 배 빠릅니다.

그러나 InnoDB의 경우 속도가 느려졌습니다! InnoDB가 인덱스를 사전로드하기 위해 버퍼를 사용하지 않습니까?


어쩌면 질문을 끝내기 위해 투표하는 행복한 중재자가 동기 부여에 대해 자세히 설명 할 수 있습니까?
pQd

문제가되는 데이터베이스와 테이블의 크기를 알려줄 수 있습니까? 디스크의 전체 크기가 유용합니다. 또한 실행중인 컴퓨터의 사양은 무엇입니까?
Dave Rix

답변:


6

MyISAM 또는 InnoDB를 결정하기 전에 각각의 캐시 방식에 따라 두 스토리지 엔진을 모두 살펴 봐야합니다.

MyISAM

읽을 때 MyISAM 테이블의 인덱스는 .MYI 파일에서 한 번 읽고 MyISAM 키 캐시 ( key_buffer_size 크기로 )에 로드 할 수 있습니다 . MyISAM 테이블의 .MYD를 더 빨리 읽을 수있게하려면 어떻게해야합니까? 이것으로 :

ALTER TABLE mytable ROW_FORMAT=Fixed;

나는 내 과거 게시물에 이것에 대해 썼다

InnoDB

좋아, InnoDB는 어때? InnoDB는 쿼리를위한 디스크 I / O를 수행합니까? 놀랍게도 그렇습니다! 당신은 아마 그 말에 미쳤다고 생각하고 있지만 SELECT 쿼리조차도 사실 입니다. 이 시점에서 "InnoDB가 어떻게 쿼리를위한 디스크 I / O를 수행 하는가?"

모든 것은 ACID 호환 트랜잭션 스토리지 엔진 인 InnoDB로 되돌아갑니다 . InnoDB가 Transactional이 되려면 Iin 을 지원해야합니다 ACID. 트랜잭션 격리를 유지하는 기술은 MVCC, Multiversion Concurrency Control을 통해 수행됩니다 . 간단히 말해서, InnoDB는 트랜잭션이 데이터를 변경하기 전에 어떤 데이터가 나타나는지 기록합니다. 그것은 어디에 기록됩니까? 시스템 테이블 스페이스 파일에서 ibdata1로 더 잘 알려져 있습니다. 이를 위해서는 디스크 I / O가 필요합니다 .

비교

InnoDB와 MyISAM은 모두 디스크 I / O를 수행하기 때문에 누가 어떤 요소를 더 빨리 지시합니까?

  • 열 크기
  • 열 형식
  • 문자 세트
  • 숫자 값의 범위 (충분히 큰 INT가 필요함)
  • 블록에서 분할되는 행 (행 체인)
  • DELETEs와 에 의해 발생하는 데이터 조각화UPDATEs
  • 기본 키 크기 (InnoDB에 클러스터 된 인덱스가 있으며 두 개의 키 조회가 필요함)
  • 색인 항목의 크기
  • 목록은 계속됩니다 ...

발문

따라서 읽기 량이 많은 환경에서는 트랜잭션 동작을 지원하기 위해 ibdata1에 포함 된 실행 취소 로그에 기록 된 데이터가 충분한 경우 고정 행 형식의 MyISAM 테이블이 InnoDB 버퍼 풀에서 InnoDB 읽기를 능가 할 수 있습니다. InnoDB 데이터에 부과됩니다. 데이터 유형, 쿼리 및 스토리지 엔진을 실제로 신중하게 계획하십시오. 데이터가 커지면 데이터 이동이 매우 어려워 질 수 있습니다.

그건 그렇고, 나는 5 일 전에 다음과 같이 썼습니다 : mySQL에 메모리 제한을 어떻게 할당합니까?


모든 데이터가 이미 버퍼 풀에 있고 동시 데이터 수정 요청이없는 경우 innodbe는 실제로 디스크 읽기를 생성합니까?
pQd

내 생각에 asker가 db에 10 억 개의 행을 가지고 있기 때문에 버퍼 풀의 RAM에 모두 캐시하지 않을 가능성이 높습니다. 따라서 버퍼 풀 외부와 디스크의 데이터를 가져 오는 데 필요한 읽기가 필요합니까?
Dave Rix

3

MyISAM은 데이터 경합이 없을 때 항상 innodb보다 훨씬 빠르게 실행됩니다. 동일한 테이블을 업데이트하려고 여러 세션을 추가하기 시작하면 innodb가 매우 빠르게 성능 이점을 얻습니다.

두 엔진의 시스템을 조정하는 방법은 매우 다릅니다.

다른 엔진이 존재하는 이유는 다른 워크로드 / 액세스 패턴이 존재하기 때문입니다.


2

innodb를 '워밍업'해야합니다. 예를 들어 액세스 로그를 재생하거나 인덱스의 각 값에 닿는 스마트 쿼리를 실행합니다.

여기 또는 여기를 살펴보십시오 .

innodb에 기본 mysql 설정을 사용하지 않기를 바랍니다. ~ 2000의 하드웨어에 적합했습니다.


기본 구성을 변경하고 쿼리를 여러 번 약 30 회 실행했지만 거의 동일한 결과를 얻었습니다. 몇 번의 시도 후에 더 빠르지 만 MYISAM보다 느리게 유지되었으며 MariaDB (최신 버전)를 사용했습니다.
Akash


0

MariaDB에서 InnoDB를 추가 조정 한 후 innodb_buffer_pool_sizeInnoDB 데이터베이스 크기로 늘 렸습니다 .InnoDB는 행을 더 빨리 가져 오기 시작했습니다.

데이터베이스 요구에 따라 InnoDB 튜닝이 매우 중요하다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.