고유 키를 사용하여 MyISAM의 파티션으로 MySQL 삽입 속도 향상


9

큰 MyISAM 테이블 (~ 30M 행)이 있습니다. 어느 시점에서 나는 고정 행 형식으로 전환 했으므로 이제 테이블은 디스크에서 ~ 40Gb, 인덱스에서는 2Gb를 사용합니다. 테이블에는 고유 인덱스가 있으며 초당 100 개의 '중복 키 업데이트시 삽입'쿼리가 있습니다. 테이블이 커짐에 따라 이러한 인서트가 점점 느려지고 있습니다.

확실하지 않지만 파티션을 사용하면 인서트 속도를 높일 수 있습니까?

답변:


1

우선 동시 쓰기는 MyISAM 스토리지 옵션이 아닙니다. 그들 각각은 전체 테이블을 잠글 것입니다 (일부 경우 읽기 제외). InnoDB가 당신에게 잘 맞지 않으면 TokuDB를 사용해보십시오. 그러나 TokuDB 엔진 (및 물론 InnoDB) 엔진의 트랜잭션 특성으로 인해 MyISAM에 비해 속도가 느려질 것입니다 (저널 및 데이터 파일 같은 두 번 이상 동일한 데이터를 작성해야 함). 또한 서버가 언젠가 충돌하면 40Gb MyISAM 테이블이 복구 될 때까지 몇 시간 동안 대기하게됩니다.

그래도 MyISAM 테이블에 데이터를로드하고 빠르게하고 싶다면 사용을 권합니다. LOAD DATA INFILE 삽입 대신 하는 . 이는 대량의 데이터를 테이블에로드하는 가장 빠른 방법입니다. 그리고 인덱스는 인덱스 삽입 성능을 기하 급수적으로 느리게합니다.

파티션에 관한 한마디 : MySQL의 INSERT 문은 프 루닝을 지원하지 않으므로 고유 한 인덱스 일치를 위해 각 명령문에서 모든 파티션을 스캔합니다. 또한 삽입이 끝날 때까지 모든 파티션이 잠 깁니다.


또 다른 흥미로운 엔진 : code.facebook.com/posts/190251048047090/…
GreyWolf

0

이러한 삽입 쿼리는 동일한 프로세스에서 동시에 발생합니까? 동시에 사용하는 경우 MyISAM이 전체 테이블을 잠그고 InnoDB는 행 잠금을 사용하므로이 테이블에 InnoDB 스토리지를 사용하는 것이 좋습니다. 다른 스토리지로 전환하는 것이 옵션이 아닌 경우 INSERT DELAYED 문 및 기타 여러 삽입 최적화를 시도 할 수 있습니다 . 다른 물리 디스크에 다른 파티션을 배치하지 않으면 파티셔닝이 도움이되지 않습니다.


이 인서트는 동시 적입니다. 그러나 InnoDB는 '중복 키 업데이트시 삽입'속도가 너무 느리므로 옵션이 아닙니다. 내가 알 수있는 한 IO는 병목 현상이 아닙니다-인덱스 및 쓰기 캐싱을 포함한 RAM의 크기 >> 테이블 크기입니다. 내 문제는 내부 mysql의 잠금 또는 어딘가에 있다고 생각합니다.
d0rc

INSERT DELAYED는 값 목록을 지정하는 INSERT 문에만 사용해야합니다. 서버는 INSERT ... SELECT 또는 INSERT ... ON DUPLICATE KEY UPDATE 문에 대해 DELAYED를 무시합니다.
llazzaro

"InnoDB가 너무 느리다"-약간 조정 해 보셨습니까? 기본 설정은 매우 좋지 않습니다.
rvs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.