흐르는 시간의 블로그...

타인의 자료를 가져온 것이므로 정확한 자료는 아래의 링크에서 확인해 주시기 바랍니다.

http://urin79.com/?_filter=search&mid=blog&search_target=title_content&search_keyword=mysql&page=2&division=-546441&  document_srl=438181

MYSQL my.cnf 최적화


MySQL 성능 개선 파라미터

For better performance, we recommend replacing the existing MySQL parameters mentioned instartDB.bat/sh, available under <FirewallAnalyzerHome>\bin directory, with the following MySQL parameterschangesfor the corresponding RAM Size. Apart from MySQL parameter changes, you can alsotune MySQL table sizes based on RAM availabililtyto improve MySQL performance.

RAM SizeMySQL Parameters For
Windows Installation
MySQL Parameters For
Linux Installation
512 MBDefault configuration as given in startDB.batDefault configuration as given in startDB.sh
1 GB--innodb_buffer_pool_size=300M
--key-buffer-size=150M
--max_heap_table_size=150M
--tmp_table_size=100M
--table-cache=512
--innodb_buffer_pool_size=300M
--key_buffer_size=150M
--max_heap_table_size=150M
--tmp_table_size=100M
--table-cache=512
2 GB--innodb_buffer_pool_size=900M
--key-buffer-size=600M
--max_heap_table_size=350M
--tmp_table_size=100M
--table-cache=512
--innodb_buffer_pool_size=900M
--key_buffer_size=600M
--max_heap_table_size=350M
--tmp_table_size=100M
--table-cache=512
3 GB--innodb_buffer_pool_size=900M
--key-buffer-size=600M
--max_heap_table_size=350M
--tmp_table_size=100M
--table-cache=512
--innodb_buffer_pool_size=1400M
--key_buffer_size=1000M
--max_heap_table_size=350M
--tmp_table_size=100M
--table-cache=512
4 GB--innodb_buffer_pool_size=900M
--key-buffer-size=600M
--max_heap_table_size=350M
--tmp_table_size=100M
--table-cache=512
--innodb_buffer_pool_size=1800M
--key_buffer_size=1200M
--max_heap_table_size=350M
--tmp_table_size=100M
--table-cache=512






# key_buffer :

# 인덱스를 위한 버퍼크기, 키 버퍼의 크기는 공유된쓰레드의 크기이며 중복된 키를 자주

# 사용할 경우 속도를 높일 수 있고, 기준은 show status 명령을 했을 때

# Key_blocks_used를 체크해서 key_buffer 사이즈를 줄이던가 늘리던가 해야 한다.

# 일반적인 key_buffer 의 크기는 Key_blocks_used*1024 로 잡으면 된다.

# Key_reads 가 크다면, key_buffer_size 변수가 너무 작은 것이다.

# 대용량 테이블일 경우 쿼리가 느리다면, 인덱스 버퍼 크기가 작아서 느릴 수 있으므로

# key_buffer 크기를 늘려 주어야 한다.

# show status 명령에서 다음과 같이 계산되는 것이 key_buffer 설정이 적당한 것이다.

# Key_reads/Key_read_request < 0.01 [ 0.00112318293327 ]

# key_write/key_write_request = 1 [ 0.0763101585936 ]

# | Key_blocks_used | 360325 | > 368972800

# | Key_read_requests | 386263882 |

# | Key_reads | 433845 |

# | Key_write_requests | 5685285 |

key_buffer = 384M

# max_allowed_packet :

# 클라이언트 통신에 대해 사용되는 버퍼가 커질수 있는 최대 크기, 이변수의 가장 큰 값은

# MySQL 4 이전은 16MB 가 될 수 있고 MySQL 4와 그 이후는 1GB까지 될 수 있다.

# 클라이언트가 커다란 BLOB나 TEXT값들을 전송하는 경우라면, 이 서버 변수를 늘릴

# 필요가 있고 클라이언트 측에서도 이것을 늘려야 할 것이다.

# shell>mysql --set-variable=max_allowed_packet=64M

max_allowed_packet = 1M

# table_cache :

# MySQL 서버가 한번에 열수 있는 테이블의 개수 설정,

# 기본값은 64개이다, Opened_tables 값이 크다면 table_cache 값이 너무 작은 것이다.

# max_connections 값과도 관계가 있는데, 만약 100이라면 table_cache는 100*n 으로

# 설정해 주는것이 좋다.

# n은 조인해서 열수 있는 최대 테이블 개수이다.

# ex ) 사용중인 테이블이 20개이고, max_connections=100이라면, table_cache 는 그의

# 5~6배인 table_cache=512 정도로 설정하는 것이 좋다.

table_cache = 512

# sort_buffer_size , read_buffer_size :

# 정렬을 위해 사용하는 버퍼 크기, ORDER BY 나 GROUP BY 절을 빠르게 하기 위해서는

# 이 값을 증가시킨다.

# 4.0.3 이전에서는

# sort_buffer_size => sort_buffer

# read_buffer_size => record_buffer

# 라는 변수로 쓰였다.

# max_used_connections에 따라서 증가시키는 것이 좋다. 한번에 많은 쓰레드가 동시에

# 붙을 경우는 증가시키는 것이 좋다. max_used_connections가 높을 경우

# sort_buffer=6M 정도로 설정하는 것이 좋고, record_buffer=2M 정도가 적당하다.

# sort_buffer와 record_buffer 를 합쳐서 8M를 넘지 않는 것이 좋다.

# (sort_buffer+record_buffer)*max_connections를 할 경우 ram을 다 차지할 수 있기

# 때문이다.

# 많은 연속적인 테이블 스캔이 이루어진다면 read_buffer_size 값을 증가시켜야 한다.

sort_buffer_size = 2M

read_buffer_size = 2M

# myisam_sort_buffer_size :

# MyISAM 테이블 타입에서 인덱스를 만들거나(create table ..), 인덱스로

# 변경(alter table ...) 하거나, 복구( repair ...) 할 때 사용하는 버퍼크기

myisam_sort_buffer_size = 64M

thread_cache = 8

# 쿼리 캐시 버퍼 사이즈

query_cache_size = 32M

# Try number of CPU's*2 for thread_concurrency

# thread_concurrency : 솔라리스에서만 사용된다.

thread_concurrency = 8

# max_connections :

# show status 명령을 했을때 , max_used_connections을 보고 늘리던가, 줄이던가 해야 한다.

# 최대값보다 10% 정도 더 크게 잡는 것이 좋다.

max_connections=1000

# max_connect_error :

# 서버가 차단되기 전에 최대 연결 오류수

max_connect_error=10000

# max_delayed_threads : INSERT DELAYED 쿼리를 사용할 수 있는 최대 쓰레드 수

max_delayed_threads=1000

# tmp_table_size = 디스크에 쓰여진 후 임시 테이블의 최대 크기

tmp_table_size=64M

# key_buffer_size :

# 인덱스를 위한 버퍼 사이즈, 느리다면 크기를 늘리는 것이 좋으나

# OS의 Ram 크기를 고려하여 늘려야 한다. 인덱스 데이터 캐싱을 위한

# 메모리 제한이 key_buffer 이다.

# 인덱스 기반의 검색과 정렬은 이 변수의 값을 늘리면 인덱스들을 만들거나 수정하는

# 동작만큼 더 빨라진다. 키 퍼버가 클수록 MySQL이 메모리 안에서 키를 찾을 확률이

# 늘어나는데 그만큼 인덱스 처리에 필요한 디스크 접근 횟수를 줄여주게 된다.

# 3.23 버전 이전에는 key_buffer 로 불렸다. 3.23부터 두 이름 모두 인식한다.

key_buffer_size=369M

key_buffer =369M


--------------------------------------------------------------------------------


# Don't listen on a TCP/IP port at all. This can be a security enhancement,

# if all processes that need to connect to mysqld run on the same host.

# All interaction with mysqld must be made via Unix sockets or named pipes.

# Note that using this option without enabling named pipes on Windows

# (via the "enable-named-pipe" option) will render mysqld useless!

#

#skip-networking

# Replication Master Server (default)

# binary logging is required for replication

# log-bin :

# 리플리케이션을 설정할때 활성화 시키는 곳?

# mysql 이 log-bin을 이용한다는 것을 알려준다.

log-bin

# required unique id between 1 and 2^32 - 1

# defaults to 1 if master-host is not set

# but will not function as a master if omitted

# server-id :

# 리플리케이션 설정을 위해. id를 부여해 준다.

# slave 의 경우 .. 2 ~ .... 중복불가!

server-id = 1

# binlog-do-db :

# 특정데이터베이스만 리플리케이션 기능을 사용할 수 있게 하는 옵션이다.

# 서버부담이 클수도 있으므로 인증 부분이 걸린 곳에 사용하면 좋을 것이다.

binlog-do-db = V2PRJ

# Replication Slave (comment out master section to use this)

#

# To configure this host as a replication slave, you can choose between

# two methods :

#

# 1) Use the CHANGE MASTER TO command (fully described in our manual) -

# the syntax is:

#

# CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,

# MASTER_USER=<user>, MASTER_PASSWORD=<password> ;

#

# where you replace <host>, <user>, <password> by quoted strings and

# <port> by the master's port number (3306 by default).

#

# Example:

#

# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,

# MASTER_USER='joe', MASTER_PASSWORD='secret';

#

# OR

#

# 2) Set the variables below. However, in case you choose this method, then

# start replication for the first time (even unsuccessfully, for example

# if you mistyped the password in master-password and the slave fails to

# connect), the slave will create a master.info file, and any later

# change in this file to the variables' values below will be ignored and

# overridden by the content of the master.info file, unless you shutdown

# the slave server, delete master.info and restart the slaver server.

# For that reason, you may want to leave the lines below untouched

# (commented) and instead use CHANGE MASTER TO (see above)

#

# required unique id between 2 and 2^32 - 1

# (and different from the master)

# defaults to 2 if master-host is set

# but will not function as a slave if omitted

#server-id = 2

#

# The replication master for this slave - required

#master-host = <hostname>

#

# The username the slave will use for authentication when connecting

# to the master - required

#master-user = <username>

#

# The password the slave will authenticate with when connecting to

# the master - required

#master-password = <password>

#

# The port the master is listening on.

# optional - defaults to 3306

#master-port = <port>

#

# binary logging - not required for slaves, but recommended

#log-bin

# Point the following paths to different dedicated disks

#tmpdir = /tmp/

#log-update = /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables

#bdb_cache_size = 384M

#bdb_max_lock = 100000

# Uncomment the following if you are using InnoDB tables

#innodb_data_home_dir = /data/

#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend

#innodb_log_group_home_dir = /data/

#innodb_log_arch_dir = /data/

# You can set .._buffer_pool_size up to 50 - 80 %

# of RAM but beware of setting memory usage too high

#innodb_buffer_pool_size = 384M

#innodb_additional_mem_pool_size = 20M

# Set .._log_file_size to 25 % of buffer pool size

#innodb_log_file_size = 100M

#innodb_log_buffer_size = 8M

#innodb_flush_log_at_trx_commit = 1

#innodb_lock_wait_timeout = 50

[mysqldump]

quick

max_allowed_packet = 16M

[mysql]

no-auto-rehash

# Remove the next comment character if you are not familiar with SQL

#safe-updates

[isamchk]

key_buffer = 256M

sort_buffer_size = 256M

read_buffer = 2M

write_buffer = 2M

[myisamchk]

key_buffer = 256M

sort_buffer_size = 256M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

타인의 자료를 가져온 것이므로 정확한 자료는 아래의 링크에서 확인해 주시기 바랍니다.

http://intomysql.blogspot.com/2010/12/mysql_9509.html

MySQL의 메모리 관련 설정 변수 (서버 및 세션 레벨)

Server level의 메모리 설정 변수
  • key_buffer_size와innodb_buffer_pool_size 는 필요 시 동적으로 계속 할당을 받아서 증가시키다가 정의된 사이즈만큼 확장하게 된다.

Session level의 메모리 설정 변수
  • 기본적으로 초기에 설정치 만큼 할당이 바로 되는 변수가 있는 반면, 조금씩 할당해 가면서 최대 정의된 용량만큼 확장되는 형태의 변수도 있다.
  • Session 별로 항상 할당되는 변수와 쿼리 수행 시 필요한 경우에만 할당되는 변수도 있다.
  • MySQL 뿐만 아니라 일반적인 서버 프로그램에서 메모리 할당은 상당히 고비용의 작업이며, 특히나 MySQL은 더더욱 그러하다.
    이러한 메모리 할당의 특성들은 Session 또는 Query level로 빠르게 할당되었다가 즉시 사라지는 이러한 메모리 버퍼들의 사이즈는 성능에 상당한 영향을 미치게 된다.
    그래서 무조건 많은 량의 메모리를 할당하는 것이 항상 좋은 것은 아니다.

Net_buffer_length & max_allowed_packet :
각 Thread는 Connection buffer와 Result buffer를 가지게 된다. 두 개 buffer 모두 초기에는 net_buffer_length 에 정의된 만큼 초기 할당하게 되고, 필요 시 최대 max_allowed_packet 에 정의된 사이즈만큼 확장된다. 쿼리가 완료되면, Result buffer는 초기 net_buffer_length에 정의된 사이즈로 다시 줄어들지만, Connection buffer는 net_buffer_length 사이즈만큼 초기화되지 않는다.
Net_buffer_length 변수는
MySQL 5.1 미만에서는 설정 가능한 변수이며 1KB ~ 1MB내에서 설정 가능하며 Default 설정 값은 16KB이다.
MySQL 5.1 이상에서는 이 값은 Default 설정 값은 16KB이며, 변경이 불가능하다.

Max_allowed_packet :
Query 문장에 대용량의 BLOB이나 TEXT 타입이 사용될 경우, 32MB 이상을 설정해야 할 경우도 있다.

Thread_stack :
Thread stack의 사이즈가 너무 작으면, 복잡한 쿼리 문장이나 프로시져의 재귀적 함수의 처리를 제한하게 될 수 있다. MySQL 5.0 그리고 MySQL 5.1 공히, 128KB 이상 설정이 가능하며, Default 값은 32Bit에서는 192KB, 64Bit에서는 256KB이다. Default 설정 값을 그대로 사용할 것을 추천한다.

Read_buffer_size :
MySQL에서 Sequential scan (full table scan)을 사용할 경우, 사용하게 되는 Buffer이며, Manual에서는 Sequential scan이 많으면 크게 설정하는 것이 좋다고 되어 있지만, 인터넷에 공유된 벤치마킹 게시물들을 보면 크게 영향이 없는 것으로 보인다. Storage engine의 종류에 관계 없이 사용되며 8KB 이상 설정 가능하며 4KB 단위로 할당이 되므로 4KB의 배수로 설정하는 것이 좋다. Default 설정 값은 128KB이며 인터넷에 공유된 벤치마킹 결과에서도 128KB가 최고의 성능을 내는 것으로 보인다.

Read_rnd_buffer_size :
정렬 작업 이후, 정렬된 순서대로 데이터를 다시 읽어 들일 때 사용되는 Buffer로서, Storage engine에 관계없이 사용된다. MySQL의 정렬은 Single-pass와 Two-pass 알고리즘이 있으며, Two-pass 알고리즘으로 정렬되는 경우에만 사용된다. 8KB 이상 설정이 가능하며, Default 값은 256KB이다. 특별한 요건이 없다면 Read_buffer_size와 동일하게 Default 값을 그대로 사용할 것은 권장한다. (자세한 내용은 Manual의 “ORDER BY optimization” 부분을 참조할 것)

Join_buffer_size :
다른 Session level 변수와 달리, 이 버퍼는 Session level에서 Join 단위로 생성이 된다. 단, Join 중에서도 인덱스를 사용할 수 없는 경우의 Join에서 이 버퍼가 할당되고 사용된다. 이 버퍼는 필요한 만큼 할당되는 것이 아니라 Join buffer가 필요한 시점에 모두 한꺼번에 할당 받게 된다. 그래서 너무 큰 설정은 성능에 상당히 나쁜 영향을 미치게 된다. Join buffer 가 사용되는지 여부는 실행 계획상에서 쉽게 확인할 수 있다. Join buffer를 이용한 Join의 방법은 다음 기회에 설명하도록 하겠다. 8KB 이상의 값을 설정할 수 있으며, Default 값은 128KB 이다.

Sort_buffer_size :
Index를 이용한 정렬이 불가능할 경우 MySQL의 별도의 filesort라는 정렬 작업을 하게 되는데, 이때 사용하는 버퍼가 Sort buffer이다. 특정 사이즈로 할당된 Sort buffer에 몇 개 정도의 레코드가 동시에 저장될 수 있는지는 정렬 알고리즘이 Single-pass인지 Two-pass인지에 따라 달라지며, 사용되는 알고리즘은 SELECT되는 필드(컬럼)들의 타입이나 전체 결과의 길이가max_length_for_sort_data 변수의 설정 값보다 큰지 작은지에 따라서 결정된다. Sort_buffer_size는 설정 값의 제한이 없으며 Default 값은 2MB이다. Sort_buffer_size 가 적절한지 여부는Sort_merge_passes 상태 변수 값으로 확인이 가능한 것으로 Manual에는 되어 있지만, Sort_merge_passes값이 2이상의 값이 된다고 해서 성능이 떨어진다고 보기에는 적절하지 않은 것 같다. 이 buffer 또한 여러 벤치마킹의 결과를 통해서 보면 많이 설정하는 것이 항상 좋은 것은 아닌 것으로 보인다. (심지어 어떤 벤치마킹에서는 450KB 이상의 sort_buffer_size는 성능 향상 효과가 없는 것으로 나타나기도 한다). 하지만 너무 작게 Buffer size를 할당하면 대 부분의 정렬 작업이 Disk I/O를 유발하게 되므로 적절한 값을 설정하는 것이 아주 중요하다. 추천하는 방법은 초기 32KB로 설정하고 시스템의 성능이나 부하를 봐가면서 최대 512KB까지 사이에서 결정하는 것으로 생각된다.

Tmp_table_size :
GROUP BY 또는 Inline view (Derrived table)가 필요한 작업 등에서는 Temporary table이 필요하게 된다. Temporary table은 초기에는 메모리에 생성되지만, Temporary table의 사이즈가 MIN(tmp_table_size,max_heap_table_size)의 설정 값보다 테이블의 사이즈가 커지는 경우에는Disk Temporary table로 변환된다. Tmp_table_size1KB이상의 값을 설정할 수 있으며, Default값은System에 의존적이다.너무 크게 설정되면 메모리의 낭비가 심해지고 너무 작게 설정되면Disk I/O가 낭비될 가능성이 있는 설정 변수이다. (Created_tmp_disk_tables / Created_tmp_tables)의 비율을 봐 가면서512KB ~ 4MB이내에서 적절히 선택하는 것이 좋아 보인다.


전체적인 MySQL 서버의 메모리 사용량 예측
Min_thread_memory =
thread_stack_size
+ (net_buffer_length * 2)

Max_thread_memory =
thread_stack_size
+ (max_allowed_packet*2)
+ read_buffer_size
+ join_buffer_size
+ sort_buffer_size
+ tmp_table_size
+ myisam_sort_buffer_size

Max_server_memory =
query_cache_size
+ innodb_buffer_pool_size
+ innodb_additional_mem_pool_size
+ innodb_log_buffer_size
+ key_buffer_size

Max_memory =
(Min_thread_memory ~ Max_thread_memory) * max_connections
+ Max_server_memory;