가장 큰 속도 향상을 제공하는 MySQL의 구성 옵션은 무엇입니까?
실제 구성 파일 개선, 테이블 유형, 하드웨어 설정, 복제 등에 대해 궁금합니다. 쿼리 구조 및 테이블 구조 이외의 모든 것 (웹 사이트 및 Stack Overflow에서 쉽게 찾을 수 있음). 쿼리 캐시 설정과 같은 것이 가장 빠른 속도를 제공 했습니까? 드라이브는 어떻습니까? 외부 RAID 또는 내부에있는 것이 더 낫습니까? 복제가 특히 읽기 큰 쿼리에서 더 나은 성능을 제공 했습니까?
MySQL의 성능을 향상시키기 위해 어떤 다른 설정/변경 사항을 적용 했습니까?
참고 : 이것이 사용량에 따라 매우 의존적이라는 것을 알고 있지만 (즉, 소규모 웹 사이트 대 데이터웨어 하우스) 대부분의 사람들이 다양한 사이트/시스템에서 작업 할 것이라고 생각하므로 다양한 분야에 적용 할 수있는 다양한 기술을 아는 것이 좋습니다. 상황. 또한 상황간에 테크닉을 옮길 수 있다고 생각합니다.
내 권장 사항은 다음과 같습니다.
다시 한번 Dave Cheney는 정말로 그것을 여기 공원에서 두 드렸습니다. 나는 당신의 질문에 대한 그의 대답에 아무것도 추가 할 수 없습니다. 그러나 나는 당신이 묻지 않은 것을 지적하고 싶습니다. Jeremy Zawodny와 Peter Zaitsev가 몇 년 전에 저에게 가르쳐 준 것처럼 잘못된 쿼리를 추적하고 최적화하는 데 소요 된 ROI는 구성 변경에 소요되는 시간에 대한 ROI를 10 배 이상 달성 할 것입니다. 물론 잘못된 구성, 잘못된 RAID 설정 또는 부족한 RAM을 원하지 않습니다. 그러나 우수하고 심지어 한계가있는 MySQL DBA의 잘못된 쿼리 (일반적으로 DBA가 아닌 개발자/프레임 워크에서 제공)는 만성 조건이며, 여기서 잘못된 구성은 지속 가능 1입니다. .
(나는 잠시 동안 그 형용사를 파고 들었지만 여전히 내가 선택한 것에 만족하지 않습니다.)
개발자가 Ruby on Rails 및 Django)와 같은 프레임 워크에서 일반적인 ORM과 같은 ORM을 사용하는 경우 반드시 모니터링해야 함을 다시 강조하고 싶습니다. 개발자가 SQL에 대한 생각을 멈추고 DB가 추상화되도록하면 정말 불쾌합니다. 방금 언급 한 두 가지 프레임 워크가 마음에 듭니다. (나쁜 입에 대해 투표하지 마십시오.) Query Sleuthing을 매우 중요하게 만듭니다. (읽기 : Job Security)
다른 몇 가지 사항 (Dave Cheney의 답변에서 언급되지 않은)
데이터의 이중 버퍼링을 방지하려면 innodb_flush_method를 O_DIRECT로 설정하십시오. RAID 카드에 배터리 지원 쓰기 캐시가 없거나 데이터가 SAN에있는 경우이를 피하십시오.
또한 innodb_thread_concurrency로 재생하십시오. 기본값은 8이라고 생각하지만 성능이 향상되는지 확인하기 위해 조정할 가치가 있습니다.
쿼리 캐시가 켜져 있는지 확인하고 통계를 확인하여 적중률을 확인합니다. 좋으면 적중률을 높이기 위해 증가 시키십시오.
실행되는 응용 프로그램에 따라 기본 격리 수준을 변경할 수 있습니다. 기본값은 REPEATABLE_READ이지만 READ_COMMITTED는 더 나은 성능을 제공 할 수 있습니다.
문이 대부분 UPDATE 및 DELETE 인 경우 수정 될 결과 집합을 반환하는 SELECT 쿼리를 수행하여 슬레이브에서 캐시를 프라이밍 할 수 있습니다. 이 작업을 수행 할 mk-slave-prefetch 도구를 확인하십시오.
MyISAM 및 InnoDB를 제외한 다른 스토리지 엔진 살펴보기
하드웨어에 대해 말할 수는 없지만 http://blog.mysqltuner.com 시도해 볼 수 있습니다. MySQL 설정을 분석하는 Perl 스크립트입니다.
http://www.thomas-krenn.com/de/wiki/MySQL_Performance_Tuning#mysqltuner.pl 에서 샘플 출력을 볼 수 있습니다.
가장 먼저해야 할 일은 메모리 매개 변수를 살펴 보는 것입니다. MySQL의 기본 설정은 매우 보수적입니다. 어떤 엔진을 사용하든 메모리 매개 변수의 수를 10 배 또는 100 배까지 높여야 할 것입니다.
다음으로해야 할 일은 테이블 캐시를 살펴 보는 것입니다. 기본값은 64이며, 테이블이 약 60 개 이하인 경우에만 유용합니다. 당신은 그것을 멀리 높이고 싶을 것입니다.
세 번째로해야 할 일은 스레드 및 연결 매개 변수를 살펴 보는 것입니다. 기본 wait_timeout은 대부분의 웹 기반 애플리케이션에서 매우 길며 30 초 정도로 줄일 수 있습니다. 이것은 MySQL이 더 빨리 연결을 얻을 수 있기 때문에 메모리 사용도 향상되어 '휴면'상태에있는 상태가 훨씬 적습니다.