답변:
MySQL의 최대 메모리 사용량은 하드웨어, 설정 및 데이터베이스 자체 에 따라 크게 달라집니다 .
하드웨어는 분명한 부분입니다. 더 많은 RAM이 더 즐겁고 더 빠른 디스크 ftw . 하지만 월간 또는 주간 뉴스 레터를 믿지 마십시오. MySQL은 선형 적으로 확장되지 않습니다. Oracle 하드웨어에서도 마찬가지입니다. 그것보다 약간 까다 롭습니다.
결론은 : 대한 추천 무엇을위한 엄지 손가락의 어떤 일반적인 규칙이없는 당신의 MySQL의 설치가. 그것은 모두 현재 사용이나 예상에 달려 있습니다.
MySQL은 동작을 최적화하기 위해 수많은 변수와 스위치를 제공합니다. 문제가 발생하면 정말 앉아서 (f'ing) 매뉴얼을 읽어야합니다.
데이터베이스의 경우 몇 가지 중요한 제약 사항이 있습니다.
InnoDB
,, MyISAM
...)stackoverflow에 대한 대부분의 MySQL 팁은 중요한 설정이라고하는 5-8 개에 대해 알려줍니다. 우선, 모든 것이 중요하지는 않습니다. 예를 들어 InnoDB에 많은 리소스를 할당하고 InnoDB를 사용하지 않는 것은 이러한 리소스가 낭비되기 때문에 의미가 없습니다.
또는-많은 사람들이 max_connection
변수 를 높이라고 제안합니다. 글쎄요, max_connections
필요하다면 MySQL이 더 많은 리소스를 할당 할 것이라는 의미이기도 합니다. 더 확실한 해결책은 DBAL에서 데이터베이스 연결을 닫거나 wait_timeout
해당 스레드를 해제 하기 위해 값을 낮추는 것 입니다.
내 표류를 잡으시면 읽고 배울 것이 정말 많습니다.
테이블 엔진은 매우 중요한 결정입니다. 많은 사람들이 초기에이를 잊어 버린 다음 갑자기 MyISAM
전체 애플리케이션을 잠그고 차단하는 30GB 크기의 테이블 과 싸우게됩니다 .
나는 MyISAM이 짜증 난다고 말하는 것은 아니지만 InnoDB
거의 또는 거의 빠르게 응답하도록 조정할 수 있으며 MyISAM
행 잠금과 같은 것을 제공하는 UPDATE
반면 MyISAM
전체 테이블은 작성 될 때 잠급니다.
자신의 인프라에서 MySQL을 자유롭게 실행할 수 있다면 Percona 서버 를 확인하는 것이 좋습니다. Facebook 및 Google (빠르게 알고있는)과 같은 회사의 많은 기여를 포함하고 있으며 Percona의 자체 드롭도 포함되어 있기 때문입니다. 교체에있어 InnoDB
,라고 XtraDB
.
percona-server (및 -client) 설정 (Ubuntu)에 대한 내 요점을 참조하십시오. http://gist.github.com/637669
데이터베이스 크기는 매우 중요합니다. 믿거 나 말거나 Intarwebs의 대부분의 사람들은 대규모 MySQL 설정을 처리 한 적이 없지만 실제로는 존재합니다. 어떤 사람들은 "PostgreSQL !!! 111 사용"과 같은 말을하기도하지만 지금은 무시합시다.
결론은 크기를 고려하여 하드웨어에 대한 결정이 내려져야한다는 것입니다. 1GB RAM에서 80GB 데이터베이스를 빠르게 실행할 수는 없습니다.
그것은 아닙니다 : 많을수록 더 즐겁습니다. 필요한 인덱스 만 설정하고으로 사용량을 확인해야 EXPLAIN
합니다. 거기에 MySQL EXPLAIN
은 실제로 제한되어 있지만 시작입니다.
이것들 my-large.cnf
과 my-medium.cnf
파일들에 대해-나는 그것들이 누구를 위해 작성되었는지조차 모릅니다. 직접 굴려보세요.
좋은 시작은 튜닝 입문서 입니다. 의 출력을 취합니다 (당신이 리눅스가 필요합니다 힌트)이 떠들썩한 파티 스크립트의 SHOW VARIABLES
와 SHOW STATUS
희망 유용한 추천으로 랩합니다. 서버가 얼마 동안 실행 된 경우이를 기반으로 할 데이터가 있으므로 권장 사항이 더 좋습니다.
튜닝 입문서는 마법의 소스가 아닙니다. 변경을 제안하는 모든 변수를 계속 읽어야합니다.
mysqlperformanceblog 를 추천하고 싶습니다 . 모든 종류의 MySQL 관련 팁에 대한 훌륭한 리소스입니다. 그리고 그것은 MySQL뿐만 아니라 적절한 하드웨어에 대해 많이 알고 있거나 AWS에 대한 설정을 권장합니다.이 사람들은 수년과 수년간의 경험을 가지고 있습니다.
물론 또 다른 훌륭한 리소스는 planet-mysql 입니다.
tuning primer
. 어떻게 비교 mysqltuner
합니까?
다음 설정을 사용합니다.
etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100
다음 사양을 가진 서버의 경우 :
Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA
데이터베이스 메모리 사용량은 복잡한 주제입니다. MySQL의 성능 블로그는 질문을 포함하는의 좋은 일을하고, 목록은 "예약"메모리에 상당히 실용적이지 왜 많은 이유를.
정말 엄격한 제한을 적용하려면 그렇게 할 수 있지만 기본 제공 설정이 없으므로 OS 수준에서 수행해야합니다. Linux에서는 ulimit를 사용할 수 있지만이를 적용하려면 MySQL이 시작되는 방식을 수정해야합니다.
가장 좋은 해결책은 일반적인 MySQL 메모리 설정을 조합하면 일반적으로 MySQL 설치에서 메모리 사용량이 낮아 지도록 서버를 조정하는 것입니다. 이것은 물론 데이터베이스의 성능에 부정적인 영향을 미칠 수 있지만 조정할 수있는 일부 설정 my.ini
은 다음 과 같습니다.
key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size
나는 거기에서 시작하여 원하는 결과를 얻을 수 있는지 확인합니다. MySQL 메모리 설정 조정에 대한 많은 기사 가 있습니다 .
편집하다:
일부 변수 이름 은 MySQL의 최신 5.1.x 릴리스에서 변경되었습니다 .
예를 들면 :
table_cache
현재 :
table_open_cache
mysqld.exe는 RAM에서 480MB를 사용했습니다. 이 매개 변수를 my.ini에 추가 한 것을 발견했습니다.
table_definition_cache = 400
메모리 사용량을 400,000 + kb에서 105,000kb로 줄였습니다.
에서 /etc/my.cnf
:
[mysqld]
...
performance_schema = 0
table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000
query_cache_size = 0
query_cache_limit = 0
...
256MB 메모리가있는 서버에서 잘 작동합니다.
table_definition_cache
= 0 인 이유는 무엇 입니까? 약간의 설명이 좋을 것입니다. 그리고 당신은 기본적으로 ... 같은 효과 쿼리를 캐싱 있지 않은 경우 query_cache_type = 0
:
docker mysql 컨테이너를 최적화하려는 경우 아래 명령이 도움이 될 수 있습니다. mysql 도커 컨테이너를 기본 480MB에서 100MB까지 실행할 수있었습니다.
docker run -d -p 3306 : 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql : / var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password