현재 사용자가 느리게 찾는 사이트 (무들)를 운영하고 있습니다. 디스크에서 임시 테이블을 만드는 MySQL의 문제를 추적했다고 생각합니다. 나는 변수 시청 created_tmp_disk_tables
MySQL의 워크 벤치 서버 관리 및 약 50 테이블 / s의 수가 증가. 하루 사용 후 created_tmp_disk_tables
> 100k입니다. 또한 메모리가 해제되지 않은 것 같습니다. 시스템을 거의 사용할 수 없을 때까지 사용량이 계속 증가하고 MySQL을 다시 시작해야합니다. 거의 매일 다시 시작해야하며 사용 가능한 메모리의 약 30-35 %를 사용하고 하루를 80 %로 마무리합니다.
데이터베이스에 얼룩이없고 쿼리를 제어 할 수 없으므로 최적화 할 수 없습니다. 또한 Percona Confirguration Wizard 를 사용하여 구성 파일을 생성했지만 my.ini도 내 문제를 해결하지 못했습니다.
질문
MySQL이 디스크에 임시 테이블을 생성하지 못하게하려면 무엇을 변경해야합니까? 변경해야 할 설정이 있습니까? 더 많은 메모리를 던져야합니까?
MySQL이 메모리를 차지하지 못하게하려면 어떻게해야합니까?
편집하다
slow_queries
로그를 활성화 하고 쿼리 SELECT GET_LOCK()
가 느리게 기록 되었음을 발견했습니다 . 빠른 검색 결과 PHP 구성 ( mysqli.allow_persistent = ON
) 에서 영구 연결을 허용 한 것으로 나타났습니다 . 나는 이것을 끈다. 이것은 MySQL이 메모리를 소비하는 속도를 줄 였지만 여전히 임시 테이블을 생성하고 있습니다.
나는 또한 key_buffer size
충분히 큰지 확인했다 . 나는 변수를 보았다 key_writes
. 이것은 0이어야합니다. 그렇지 않은 경우 key_buffer_size
.I를 늘리십시오 .0이 key_reads
0 key_writes
이므로 key_buffer_size
충분히 큽니다.
created_tmp_disk_tables가 증가하면 테이블이 메모리에 맞지 않음을 나타낼 수 있으므로 tmp_table_size
and max-heap-table-size
1024M을 늘 렸습니다. 이것은 해결하지 못했습니다.
편집 2
sort_merge_passes
SHOW GLOBAL STATUS 출력에 초당 많은 수가 표시되면 sort_buffer_size
값을 늘리는 것을 고려할 수 있습니다 . 나는 sort_merge_passes
한 시간에 2 를 가지고 있었 으므로 sort_buffer_size
충분히 크다고 생각합니다 .
참조 : Mysql Manual on sort_buffer_size
편집 3
@RolandoMySQLDBA에서 제안한대로 정렬 및 조인 버퍼를 수정했습니다. 결과는 아래 표에 표시되어 있지만 created_tmp_tables_on_disk
여전히 높은 것으로 생각합니다 . 값을 변경 한 후 mysql 서버를 다시 시작하고 created_tmp_tables_on_disk
하루 (8h)를 확인하고 평균을 계산했습니다. 다른 제안? 어떤 종류의 컨테이너에는 맞지 않는 것이 있지만 그것이 무엇인지 알아낼 수없는 것 같습니다.
+---------------------+-------------+-------------+--------------------+
| Tmp_table_size, | Sort_buffer | Join_buffer | No of created |
| max_heap_table_size | | | tmp_tables on disk |
+---------------------+-------------+-------------+--------------------+
| 125M | 256K | 256K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 512K | 512K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 1M | 1M | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 4M | 4M | 100k/h |
+---------------------+-------------+-------------+--------------------+
이것은 내 구성입니다.
+-----------------------+-----------------------+
|DATABASE SERVER |WEB SERVER |
+-----------------------+-----------------------+
|Windows Server 2008 R2 |Windows Server 2008 R2 |
+-----------------------+-----------------------+
|MySQL 5.1.48 |IIS 7.5 |
+-----------------------+-----------------------+
|4 Core CPU |4 Core CPU |
+-----------------------+-----------------------+
|4GB RAM |8GB RAM |
+-----------------------+-----------------------+
추가 정보
+--------------------+---------+
|PARAM |VALUE |
+--------------------+---------+
|Num of tables in Db |361 |
+--------------------+---------+
|Size of database |2.5G |
+--------------------+---------+
|Database engine |InnoDB |
+--------------------+---------+
|Read/write ratio |3.5 |
|(Innodb_data_read/ | |
|innodb_data_written)| |
+--------------------+---------+
|Avg table size |15k rows |
+--------------------+---------+
|Max table size |744k rows|
+--------------------+---------+
이 설정은 나에게 주어 졌으므로 제어가 제한되었습니다. 웹 서버는 CPU와 RAM을 거의 사용하지 않으므로 해당 시스템을 병목 현상으로 제외했습니다. 대부분의 MySQL 설정은 구성 자동 생성 도구에서 시작됩니다.
며칠 동안 PerfMon을 사용하여 시스템을 모니터링했습니다. 이것으로 디스크로 스왑하는 OS가 아니라고 결론을 내립니다.
My.ini
[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="D:/DBs/Data/"
default-character-set=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=125
query_cache_size=350M
table_cache=1520
tmp_table_size=125M
table-definition-cache= 1024
max-heap-table-size= 32M
thread_cache_size=38
MyISAM Specific options
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=125M
key_buffer_size=55M
read_buffer_size=1024K
read_rnd_buffer_size=256K
sort_buffer_size=1024K
join_buffer_size=1024K
INNODB Specific options
innodb_data_home_dir="D:/DBs/"
innodb_additional_mem_pool_size=32M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=16M
innodb_buffer_pool_size=2G
innodb_log_file_size=407M
innodb_thread_concurrency=8