복붙노트

[SQL] MySQL의 최적화 INSERT 속도 때문에 지표의 둔화되고

SQL

MySQL의 최적화 INSERT 속도 때문에 지표의 둔화되고

MySQL의 문서 말 :

테이블의 크기는 B 트리 인덱스를 가정하면, 로그 N에 의해 ​​인덱스 삽입 느려.

각각의 새로운 행의 삽입, 삽입 속도가 로그 N N의 요인에 의해 둔화 될 것이라고이 평균을 하는가, 나는 행 수 가정? 난 그냥 하나 개의 쿼리의 모든 행을 삽입 할 경우에도? 즉 :

INSERT INTO mytable VALUES (1,1,1), (2,2,2),  (3,3,3), .... ,(n,n,n)

여기서 n은 ~ 70,000

저는 현재 다음과 같은 구조의 테이블 ~ 1,470,000 행이 :

CREATE TABLE mytable (
   `id` INT,
   `value` MEDIUMINT(5),
   `date` DATE,
   PRIMARY_KEY(`id`,`date`)
) ENGINE = InnoDB

내가 거래에서 언급 한 패션 위에 삽입하면은 ~ 걸리는 시간은 275 초 커밋합니다. 새로운 데이터는 단지 속도를 늦추고 계속됩니다 일상 및 삽입 시간을 추가 할 수 있기 때문에 어떻게이를 최적화 할 수 있습니다.

또한, 거기에 아무것도 단지 그 힘의 도움을 쿼리에서 떨어져입니까? 어쩌면 일부 구성 설정?

본인은 그 단지 속도 삽입 삽입 힘 도움말 전에 인덱스를 제거. 그리고 삽입 한 후, 다시 인덱스를 추가 할 수 있습니다. 그러나 여기 유일한 인덱스는 기본 키, 그리고 내 생각에 많은 도움이되지 않습니다 떨어지고. 기본 키가 삭제하면서 또한, 모든 선택 쿼리 속도가 느린 마비됩니다.

나는 어떤 다른 가능한 방법을 알고하지 않습니다.

편집 : 여기에 삽입에 대한 몇 가지 테스트 ~ 1.47 달러의 행이 테이블에 60,000 행은 ~입니다 :

일반 쿼리 전술 사용하여 146 초

MySQL의의 LOAD 데이터 INFILE을 사용 : 145 초

1백36초 60 개 파일 1000 행에 각 136 초 (6 개) 파일 만 개 행 각각 : 그의 대답에 데이비드 Jashi에 의해 제안로 MySQL의 LOAD 데이터 INFILE 및 분할에게 CSV 파일을 사용하여

분리 및 기본 키를 다시 추가 : 키 제거 ~ 전혀 고려 다시 추가 기본 키 165 초 11 초, 데이터 삽입 0.8 초 BUT 1백53초했다

해결법

  1. ==============================

    1.당신이 빠른 삽입을 원하는 경우에, 당신이 필요로하는 첫번째 것은 적절한 하드웨어입니다. 즉 RAM의 충분한 양, SSD를 대신 기계적인 드라이브 오히려 강력한 CPU를 가정합니다.

    당신이 빠른 삽입을 원하는 경우에, 당신이 필요로하는 첫번째 것은 적절한 하드웨어입니다. 즉 RAM의 충분한 양, SSD를 대신 기계적인 드라이브 오히려 강력한 CPU를 가정합니다.

    당신이 이노을 사용하기 때문에, 당신이 원하는 것은 기본 설정이 느리고 오래된 기계를 위해 설계되어 있기 때문에이를 최적화하는 것입니다.

    여기에 이노를 구성하는 방법에 대한 좋은 읽기입니다

    그 후, 당신은 한 가지를 알아야합니다 - 그리고 데이터베이스가 내부적으로 자신의 물건을 어떻게의, 어떻게 하드 드라이브에 너무 작동합니다. 나는 다음과 같은 설명의 메커니즘을 단순화 할 수 있습니다 :

    트랜잭션은 MySQL이이 데이터를 쓴 있는지 확인하려면 하드 드라이브를 기다리고 있습니다. 트랜잭션이 기계적인 드라이브에 느린 이유의, 그들은 초당 200 ~ 400 입력 - 출력 작업을 할 수 있습니다. 번역 된 것을 의미 당신은 기계적인 드라이브에 두 번째 사용 이노 당 200ish 삽입 쿼리를 얻을 수 있습니다. 당연히, 이것은 트랜잭션 뒤의 전체 메커니즘이 아니다, 단지 무슨 일이 일어나고 있는지 윤곽을, 설명을 단순화된다.

    쿼리 때문에, 테이블의 크기에 해당 특히 하나 바이트의 측면에서 상대적으로 작은 - 효과적으로 단일 쿼리에 귀중한 IOPS을 낭비하고 있습니다.

    여러 쿼리를 포장하면 하나의 트랜잭션 (100 또는 200 이상, 더 정확한 수는 없다, 당신은 테스트가) 다음 커밋 - 즉시 초당 쓰기를 달성 할 수 있습니다.

    Percona의 사람들은 상대적으로 저렴한 하드웨어에서 15,000 삽입 두 번째를 달성하고 있습니다. 심지어 5K 삽입 두 번째는 나쁘지 않다. 표 당신이 작은 등 (, 나는 비슷한 테이블에 테스트를 완료했습니다 (3 열 이상) 나는 240기가바이트 SSD와 16기가바이트 램 기계를 사용, 눈에 띄는 문제없이 10 억 개 기록에 도착 관리 1 개 드라이브, RAID가, ) 테스트 목적으로 사용됩니다.

    TL; DR : - SSD를 얻을, 서버를 구성, 위의 링크를 따라 한 거래 및 이익에서 여러 삽입을 포장. 그리고 오프 색인 켜지지 어떤 시점에서 처리하고 구축 IO 시간을 보내고 있기 때문에 다음에, 그것은 항상 적용 아니다 않습니다.

  2. ==============================

    2.인덱스를 제거하면 도움이 어쨌든 있는지 것입니다. 또한 LOAD 데이터를 사용하는 것이 좋습니다. 당신은 몇 가지 비교 여기에 벤치 마크를 찾을 수 있습니다

    인덱스를 제거하면 도움이 어쨌든 있는지 것입니다. 또한 LOAD 데이터를 사용하는 것이 좋습니다. 당신은 몇 가지 비교 여기에 벤치 마크를 찾을 수 있습니다

    또한 PRIMARY KEY 순차적 표의 제 서 사용할 필드 구조에서 두 번째 및 세 번째 필드, 즉 스위치 위치를 생성 할 때.

  3. ==============================

    3.그런 다음, 인덱스를 삭제 삽입을하고, 인덱스 아마 빠를 것이다 재건, 백만 행 대량 삽입을 수행하는 경우. 문제는 단일 행 삽입이 너무 오래 복용하는 것입니다 경우에, 당신은 다른 (메모리가 부족 같은) 문제와 인덱스를 삭제하는 것이 많은 도움이되지 않습니다 있습니다.

    그런 다음, 인덱스를 삭제 삽입을하고, 인덱스 아마 빠를 것이다 재건, 백만 행 대량 삽입을 수행하는 경우. 문제는 단일 행 삽입이 너무 오래 복용하는 것입니다 경우에, 당신은 다른 (메모리가 부족 같은) 문제와 인덱스를 삭제하는 것이 많은 도움이되지 않습니다 있습니다.

  4. ==============================

    4.건물 / 인덱스를 다시 작성하면 속도를하려는 것입니다. 이 테이블 / 키 구조, 빠른 하드웨어 및 / 또는 인덱스 빌드 속도를 서버 구성 가능성이 대답은 조정을해야하는 경우 - 확인 서버와 설정이 메모리에서 수행 할 수 있도록 있습니다합니다.

    건물 / 인덱스를 다시 작성하면 속도를하려는 것입니다. 이 테이블 / 키 구조, 빠른 하드웨어 및 / 또는 인덱스 빌드 속도를 서버 구성 가능성이 대답은 조정을해야하는 경우 - 확인 서버와 설정이 메모리에서 수행 할 수 있도록 있습니다합니다.

    그렇지 않으면 속도를 삽입 개선 할 구조와 장단점을 만들기에 대해 생각합니다. 또한, 방법은 3 분의 삽입과 함께 행복하게 살 수에 대해 생각합니다.

  5. ==============================

    5.나는 때로는 일부 대량 작업을 허용하도록 보인다 도움이 될 수 있습니다 매체 덩어리에 거래를 삽입하는 경우에 발견했다. 다른 경우에 그것은 아마도 느린 인해 잠금 및 트랜잭션 오버 것을 만들었다.

    나는 때로는 일부 대량 작업을 허용하도록 보인다 도움이 될 수 있습니다 매체 덩어리에 거래를 삽입하는 경우에 발견했다. 다른 경우에 그것은 아마도 느린 인해 잠금 및 트랜잭션 오버 것을 만들었다.

  6. from https://stackoverflow.com/questions/16977898/mysql-optimizing-insert-speed-being-slowed-down-because-of-indices by cc-by-sa and MIT license