MySQL에 대해 말할 수있는 한 가지 사실은 트랜잭션 (ACID 호환) 스토리지 엔진 인 InnoDB가 실제로 다중 스레드라는 것입니다. 그러나 그것은 당신이 그것을 구성하는 것처럼 멀티 스레드입니다 !!! "즉시 사용 가능"하더라도 InnoDB는 기본 설정으로 단일 CPU 환경에서 뛰어난 성능을 발휘합니다. InnoDB 멀티 스레딩 기능을 활용하려면 많은 옵션을 활성화해야합니다.
innodb_thread_concurrency 는 InnoDB가 열린 상태로 유지할 수있는 동시 스레드 수의 상한을 설정합니다. 이 설정에 가장 적합한 라운드 수는 (2 X CPU 수) + 디스크 수입니다. 업데이트 : Percona NYC Conference에서 직접 배웠을 때 InnoDB Storage Engine이 실행중인 환경에 가장 적합한 스레드 수를 찾도록 경고하려면이를 0으로 설정해야합니다.
innodb_concurrency_tickets 는 동시성 검사를 무시할 수없는 스레드 수를 설정합니다. 이 한계에 도달하면 스레드 동시성 검사가 다시 표준이됩니다.
innodb_commit_concurrency 는 커밋 할 수있는 동시 트랜잭션 수를 설정합니다. 기본값은 0이므로 설정하지 않으면 여러 트랜잭션을 동시에 커밋 할 수 있습니다.
innodb_thread_sleep_delay 는 InnoDB 대기열에 다시 들어가기 전에 InnoDB 스레드가 휴면 될 수있는 시간 (밀리 초)을 설정합니다. 기본값은 10000 (10 초)입니다.
innodb_read_io_threads 및 innodb_write_io_threads (MySQL 5.1.38 이후)는 읽기 및 쓰기를 위해 지정된 수의 스레드를 할당합니다. 기본값은 4이고 최대 값은 64입니다.
innodb_replication_delay 는 슬레이브에 스레드 지연을 부과하여 innodb_thread_concurrency에 도달합니다.
innodb_read_ahead_threshold 는 비동기 판독으로 전환하기 전에 설정된 범위 (64 페이지 [페이지 = 16K])의 선형 판독을 허용합니다.
더 많은 옵션을 지명하면 시간이 나를 벗어날 것입니다. 이에 대한 정보는 MySQL의 Documentation 에서 확인할 수 있습니다 .
대부분의 사람들은 이러한 기능을 인식하지 못하고 ACID 호환 트랜잭션을 수행하는 InnoDB에 상당히 만족합니다. 이러한 옵션을 조정하면 위험을 감수해야합니다.
MySQL 5.5 다중 버퍼 풀 인스턴스 (9 버퍼 풀 인스턴스에서 162GB)를 사용하여 데이터를 메모리에 자동 분할하려고 시도했습니다. 일부 전문가들은 이것이 50 %의 성능 향상을 제공해야한다고 말합니다. 내가 얻은 것은 실제로 InnoDB를 크롤링하는 많은 스레드 잠금이었습니다. 나는 1 버퍼 (162GB)로 전환했고 세계에서 다시 잘되었습니다. 이것을 설정하려면 Percona 전문가가 필요하다고 생각합니다. 나는 내일 뉴욕에서 열리는 Percona MySQL Conference에 참석할 것이며 기회가 충분하다면 이것에 대해 물을 것입니다.
결론적으로, InnoDB는 다중 스레드 작업에 대한 기본 설정이 주어지면 다중 CPU 서버에서 잘 작동합니다. 그것들을 조정하려면 많은주의, 인내심, 훌륭한 문서 및 훌륭한 커피 (또는 Red Bull, Jolt 등)가 필요합니다.
좋은 아침, 좋은 밤, 좋은 밤!
업데이트 2011-05-27 20:11
목요일 뉴욕 에서 열린 Percona MySQL Conference에서 돌아 왔습니다 . 무슨 회의입니다. 많은 것을 배웠지 만 InnoDB와 관련하여 살펴볼 답변이 있습니다. 나는 Ronald Bradford에 의해 innodb_thread_concurrency를 0으로 설정하면 InnoDB가 스레드 동시성으로 내부적으로 최상의 행동 과정을 결정할 수 있다고 알렸다 . 나는 MySQL 5.5에서 이것을 더 실험 할 것이다.
업데이트 2011-06-01 11:20
하나의 긴 쿼리가 진행되는 한 InnoDB는 ACID를 준수 하며 MultiVersion Concurrency Control을 사용하여 매우 잘 작동 합니다 . 트랜잭션은 다른 사람이 데이터에 액세스하지 못하도록 차단하는 격리 수준 (기본적으로 반복 가능한 읽기)을 수행 할 수 있어야합니다.
멀티 코어 시스템의 경우 InnoDB는 먼 길을 왔습니다. 과거에는 InnoDB가 멀티 코어 환경에서 제대로 작동하지 못했습니다. 여러 코어가 여러 mysqld 프로세스를 CPU에 분산 시키려면 단일 서버에서 여러 mysql 인스턴스를 실행해야했던 것을 기억합니다. 퍼 노나 (Percona)와 이후 MySQL (eh, Oracle, 여전히 저를 개그라고 말함) 덕분에 더 이상 필요하지 않습니다. InnoDB를 더 많은 튜닝없이 단순하게 코어에 액세스 할 수있는보다 성숙한 스토리지 엔진으로 개발했기 때문입니다. 현재 InnoDB 인스턴스는 단일 코어 서버에서 잘 작동 할 수 있습니다.