杉哥的个人博客

my.ini详解

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
#避免外部锁定(默认是ON).
skip-external-locking
#索引缓冲区(仅作用于MYISAM表和临时表),决定了数据库索引处理的速度,改为10M
key_buffer_size = 16K
#通信缓冲区的最大长度。包或任何生成的/中间字符串的最大大小。可改为更大的比如32M
max_allowed_packet = 1M
#所有线程打开的表的数目(一个表使用2个文件描述符),表数量多,就要大一些。增大该值可以增加mysqld需要的文件描述符的数量。可以检查Opened_tables(已经打开的表的数量)状态变量来检查你是否需要增加表缓存。可改为2048
table_open_cache = 4
#每个排序线程分配的缓冲区的大小。增加该值可以加快ORDER BY或GROUP BY操作,可改为5M
#排序缓冲区内存大小,在有查询需要排序时才分配内存,分配这个参数的全部大小!
sort_buffer_size = 64K
#MyISAM表进行全表扫描时,每个线程连续扫描时为扫描的每个表分配的读缓冲区的大小,如果进行多次连续扫描,可能需要增加该值,可改为1M,一定要是4k的倍数!
read_buffer_size = 256K
#索引缓冲区的大小,只会分配需要的大小。当排序后按排序后的顺序读取行时,则通过该缓冲区读取行,避免搜索硬盘。将该变量设置为较大的值可以大大改进ORDER BY的性能。但是,这是为每个客户端分配的缓冲区,因此你不应将全局变量设置为较大的值。相反,只为需要运行大查询的客户端更改会话变量。可改为2M
read_rnd_buffer_size = 256K
#在查询之间将通信缓冲区重设为该值。如果语句超出该长度,缓冲区自动扩大,直到max_allowed_packet字节。
net_buffer_length = 2K
#每个线程的堆栈大小
#thread_stack = 128K #thread_stack = 194K
#mysql服务器安装目录
basedir=f:/server/mysql
#mysql数据存储目录
datadir=f:/server/mysql/data
#mysql数据库编码(防止命令行下乱码)
character-set-server = gbk
#主从同步配置。主机是1。备机从2开始。
server-id = 1
#启动数据库更新二进制日志记录,日志文件名前缀为mysql-bin
#log-bin=mysql-bin
# binary logging format - mixed recommended
#binlog_format=mixed
# Causes updates to non-transactional engines using statement format to be
# written directly to binary log. Before using this option make sure that
# there are no dependencies between transactional and non-transactional
# tables such as in the statement INSERT INTO t_myisam SELECT * FROM
# t_innodb; otherwise, slaves may diverge from the master.
#binlog_direct_non_transactional_updates=TRUE
# Uncomment the following if you are using InnoDB tables
#InnoDB 不会自己建立目录,必须自己使用操作系统命令建立相应的目录。检查你的 MySQL 服务程序在datadir 目录里 有足够的权限建立文件(mysql用户组拥有)。
#这是InnoDB表的目录共用设置。如果没有设置,InnoDB 将使用MySQL的 datadir 目录为缺省目录。如果设定一个空字串,可以在 innodb_data_file_path 中设定绝对路径。
#innodb_data_home_dir = C:\\mysql\\data\\
#这里应当预先创建好10个2048M的文件,目前还没有创建 innodb_data_file_path = ibdata1:2000M;ibdata2:2000M;ibdata3:2000M;ibdata4:2000M;ibdata5:2000M;ibdata6:2000M;ibdata7:2000M;ibdata8:2000M;ibdata9:2000M;ibdata10:2000M:autoextend
#innodb_data_file_path = ibdata1:10M:autoextend
#InnoDB 日志文件的路径。如果没有明确指定将默认在 MySQL 的 datadir 目录下建立两个 5 MB 大小的ib_logfile0和ib_logfile1文件。
#将日志文件与数据文件分别放在不同的物理硬盘中对提高性能通常是很有益的
#innodb_log_group_home_dir = C:\\mysql\\data\\
#表和索引数据的内存缓冲区,越大性能越高。但不能超过物理内存的50%。若64位OS,该值可以更大。32位OS受2G内存的限制,不能将内存使用设置太高, glibc 会把进程堆增长到线程堆栈之上,这将会使服务器崩溃。下面的接近或超过于 2G 将会很危险:innodb_buffer_pool_size + key_buffer + max_connections * (sort_buffer_size + record_buffer_size + binlog_cache_size) + max_connections * 2 MB
#每个线程将使用 2MB(MySQL AB 二进制版本为 256 KB)的堆栈,在最坏的环境下还会使用 sort_buffer_size + record_buffer_size 的附加内存。可改为512M
#总内存-(每个线程所需要的内存*连接数)-系统保留内存
#innodb_buffer_pool_size = 16M
#主要用来存储表结构和数据字典,表越多要求内存就越大,可改为16M
#innodb_additional_mem_pool_size = 2M
#日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组(innodb_log_files_in_group)中日志文件的数目,那么理想的数值为 1M 至缓冲池(innodb_log_buffer_size)大小的 1/n。较大的值,可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。可改为256M
#innodb_log_file_size = 5M
#InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。因此,如果有大的事务,设置大的日志缓冲可以减少磁盘I/O。
#innodb_log_buffer_size = 8M
#1表示每次事务结束都写日志并刷新磁盘;2表示每次事务写日志但不刷新磁盘(每秒刷新);0(默认值)表示每秒写日志并刷新磁盘。0表示最多丢失1秒的数据,但性能最好。
#innodb_flush_log_at_trx_commit = 1
#InnoDB行锁导致的死锁等待时间(默认值是50S),可改为30
#innodb_lock_wait_timeout = 50
[client] #password = your_password port = 3306 socket = /tmp/mysql.sock # Here follows entries for some specific programs # The MySQL server [mysqld] port = 3306 socket = /tmp/mysql.sock #避免外部锁定(默认是ON). skip-external-locking #索引缓冲区(仅作用于MYISAM表和临时表),决定了数据库索引处理的速度,改为10M key_buffer_size = 16K #通信缓冲区的最大长度。包或任何生成的/中间字符串的最大大小。可改为更大的比如32M max_allowed_packet = 1M #所有线程打开的表的数目(一个表使用2个文件描述符),表数量多,就要大一些。增大该值可以增加mysqld需要的文件描述符的数量。可以检查Opened_tables(已经打开的表的数量)状态变量来检查你是否需要增加表缓存。可改为2048 table_open_cache = 4 #每个排序线程分配的缓冲区的大小。增加该值可以加快ORDER BY或GROUP BY操作,可改为5M #排序缓冲区内存大小,在有查询需要排序时才分配内存,分配这个参数的全部大小! sort_buffer_size = 64K #MyISAM表进行全表扫描时,每个线程连续扫描时为扫描的每个表分配的读缓冲区的大小,如果进行多次连续扫描,可能需要增加该值,可改为1M,一定要是4k的倍数! read_buffer_size = 256K #索引缓冲区的大小,只会分配需要的大小。当排序后按排序后的顺序读取行时,则通过该缓冲区读取行,避免搜索硬盘。将该变量设置为较大的值可以大大改进ORDER BY的性能。但是,这是为每个客户端分配的缓冲区,因此你不应将全局变量设置为较大的值。相反,只为需要运行大查询的客户端更改会话变量。可改为2M read_rnd_buffer_size = 256K #在查询之间将通信缓冲区重设为该值。如果语句超出该长度,缓冲区自动扩大,直到max_allowed_packet字节。 net_buffer_length = 2K #每个线程的堆栈大小 #thread_stack = 128K #thread_stack = 194K #mysql服务器安装目录 basedir=f:/server/mysql #mysql数据存储目录 datadir=f:/server/mysql/data #mysql数据库编码(防止命令行下乱码) character-set-server = gbk #主从同步配置。主机是1。备机从2开始。 server-id = 1 #启动数据库更新二进制日志记录,日志文件名前缀为mysql-bin #log-bin=mysql-bin # binary logging format - mixed recommended #binlog_format=mixed # Causes updates to non-transactional engines using statement format to be # written directly to binary log. Before using this option make sure that # there are no dependencies between transactional and non-transactional # tables such as in the statement INSERT INTO t_myisam SELECT * FROM # t_innodb; otherwise, slaves may diverge from the master. #binlog_direct_non_transactional_updates=TRUE # Uncomment the following if you are using InnoDB tables #InnoDB 不会自己建立目录,必须自己使用操作系统命令建立相应的目录。检查你的 MySQL 服务程序在datadir 目录里 有足够的权限建立文件(mysql用户组拥有)。 #这是InnoDB表的目录共用设置。如果没有设置,InnoDB 将使用MySQL的 datadir 目录为缺省目录。如果设定一个空字串,可以在 innodb_data_file_path 中设定绝对路径。 #innodb_data_home_dir = C:\\mysql\\data\\ #这里应当预先创建好10个2048M的文件,目前还没有创建 innodb_data_file_path = ibdata1:2000M;ibdata2:2000M;ibdata3:2000M;ibdata4:2000M;ibdata5:2000M;ibdata6:2000M;ibdata7:2000M;ibdata8:2000M;ibdata9:2000M;ibdata10:2000M:autoextend #innodb_data_file_path = ibdata1:10M:autoextend #InnoDB 日志文件的路径。如果没有明确指定将默认在 MySQL 的 datadir 目录下建立两个 5 MB 大小的ib_logfile0和ib_logfile1文件。 #将日志文件与数据文件分别放在不同的物理硬盘中对提高性能通常是很有益的 #innodb_log_group_home_dir = C:\\mysql\\data\\ #表和索引数据的内存缓冲区,越大性能越高。但不能超过物理内存的50%。若64位OS,该值可以更大。32位OS受2G内存的限制,不能将内存使用设置太高, glibc 会把进程堆增长到线程堆栈之上,这将会使服务器崩溃。下面的接近或超过于 2G 将会很危险:innodb_buffer_pool_size + key_buffer + max_connections * (sort_buffer_size + record_buffer_size + binlog_cache_size) + max_connections * 2 MB #每个线程将使用 2MB(MySQL AB 二进制版本为 256 KB)的堆栈,在最坏的环境下还会使用 sort_buffer_size + record_buffer_size 的附加内存。可改为512M #总内存-(每个线程所需要的内存*连接数)-系统保留内存 #innodb_buffer_pool_size = 16M #主要用来存储表结构和数据字典,表越多要求内存就越大,可改为16M #innodb_additional_mem_pool_size = 2M #日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组(innodb_log_files_in_group)中日志文件的数目,那么理想的数值为 1M 至缓冲池(innodb_log_buffer_size)大小的 1/n。较大的值,可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。可改为256M #innodb_log_file_size = 5M #InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。因此,如果有大的事务,设置大的日志缓冲可以减少磁盘I/O。 #innodb_log_buffer_size = 8M #1表示每次事务结束都写日志并刷新磁盘;2表示每次事务写日志但不刷新磁盘(每秒刷新);0(默认值)表示每秒写日志并刷新磁盘。0表示最多丢失1秒的数据,但性能最好。 #innodb_flush_log_at_trx_commit = 1 #InnoDB行锁导致的死锁等待时间(默认值是50S),可改为30 #innodb_lock_wait_timeout = 50
[client]

#password = your_password

port  = 3306

socket  = /tmp/mysql.sock

# Here follows entries for some specific programs

# The MySQL server

[mysqld]

port  = 3306

socket  = /tmp/mysql.sock

#避免外部锁定(默认是ON).

skip-external-locking

#索引缓冲区(仅作用于MYISAM表和临时表),决定了数据库索引处理的速度,改为10M

key_buffer_size = 16K

#通信缓冲区的最大长度。包或任何生成的/中间字符串的最大大小。可改为更大的比如32M

max_allowed_packet = 1M

#所有线程打开的表的数目(一个表使用2个文件描述符),表数量多,就要大一些。增大该值可以增加mysqld需要的文件描述符的数量。可以检查Opened_tables(已经打开的表的数量)状态变量来检查你是否需要增加表缓存。可改为2048  

table_open_cache = 4     

#每个排序线程分配的缓冲区的大小。增加该值可以加快ORDER BY或GROUP BY操作,可改为5M

#排序缓冲区内存大小,在有查询需要排序时才分配内存,分配这个参数的全部大小!

sort_buffer_size = 64K 

#MyISAM表进行全表扫描时,每个线程连续扫描时为扫描的每个表分配的读缓冲区的大小,如果进行多次连续扫描,可能需要增加该值,可改为1M,一定要是4k的倍数!

read_buffer_size = 256K  

#索引缓冲区的大小,只会分配需要的大小。当排序后按排序后的顺序读取行时,则通过该缓冲区读取行,避免搜索硬盘。将该变量设置为较大的值可以大大改进ORDER BY的性能。但是,这是为每个客户端分配的缓冲区,因此你不应将全局变量设置为较大的值。相反,只为需要运行大查询的客户端更改会话变量。可改为2M

read_rnd_buffer_size = 256K 

#在查询之间将通信缓冲区重设为该值。如果语句超出该长度,缓冲区自动扩大,直到max_allowed_packet字节。 

net_buffer_length = 2K

#每个线程的堆栈大小

#thread_stack = 128K          #thread_stack = 194K

#mysql服务器安装目录

basedir=f:/server/mysql

#mysql数据存储目录

datadir=f:/server/mysql/data

#mysql数据库编码(防止命令行下乱码)

character-set-server = gbk

 

#主从同步配置。主机是1。备机从2开始。

server-id = 1

#启动数据库更新二进制日志记录,日志文件名前缀为mysql-bin

#log-bin=mysql-bin

# binary logging format - mixed recommended

#binlog_format=mixed

# Causes updates to non-transactional engines using statement format to be

# written directly to binary log. Before using this option make sure that

# there are no dependencies between transactional and non-transactional

# tables such as in the statement INSERT INTO t_myisam SELECT * FROM

# t_innodb; otherwise, slaves may diverge from the master.

#binlog_direct_non_transactional_updates=TRUE

# Uncomment the following if you are using InnoDB tables

 #InnoDB 不会自己建立目录,必须自己使用操作系统命令建立相应的目录。检查你的 MySQL 服务程序在datadir 目录里 有足够的权限建立文件(mysql用户组拥有)。

#这是InnoDB表的目录共用设置。如果没有设置,InnoDB 将使用MySQL的 datadir 目录为缺省目录。如果设定一个空字串,可以在 innodb_data_file_path 中设定绝对路径。

#innodb_data_home_dir = C:\\mysql\\data\\      

#这里应当预先创建好10个2048M的文件,目前还没有创建  innodb_data_file_path = ibdata1:2000M;ibdata2:2000M;ibdata3:2000M;ibdata4:2000M;ibdata5:2000M;ibdata6:2000M;ibdata7:2000M;ibdata8:2000M;ibdata9:2000M;ibdata10:2000M:autoextend

#innodb_data_file_path = ibdata1:10M:autoextend   

#InnoDB 日志文件的路径。如果没有明确指定将默认在 MySQL 的 datadir 目录下建立两个 5 MB 大小的ib_logfile0和ib_logfile1文件。

#将日志文件与数据文件分别放在不同的物理硬盘中对提高性能通常是很有益的

#innodb_log_group_home_dir = C:\\mysql\\data\\     

#表和索引数据的内存缓冲区,越大性能越高。但不能超过物理内存的50%。若64位OS,该值可以更大。32位OS受2G内存的限制,不能将内存使用设置太高, glibc 会把进程堆增长到线程堆栈之上,这将会使服务器崩溃。下面的接近或超过于 2G 将会很危险:innodb_buffer_pool_size + key_buffer +    max_connections * (sort_buffer_size + record_buffer_size + binlog_cache_size) + max_connections * 2 MB

#每个线程将使用 2MB(MySQL AB 二进制版本为 256 KB)的堆栈,在最坏的环境下还会使用 sort_buffer_size + record_buffer_size 的附加内存。可改为512M
#总内存-(每个线程所需要的内存*连接数)-系统保留内存

#innodb_buffer_pool_size = 16M            

#主要用来存储表结构和数据字典,表越多要求内存就越大,可改为16M

#innodb_additional_mem_pool_size = 2M

#日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组(innodb_log_files_in_group)中日志文件的数目,那么理想的数值为 1M 至缓冲池(innodb_log_buffer_size)大小的 1/n。较大的值,可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。可改为256M

#innodb_log_file_size = 5M

#InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。因此,如果有大的事务,设置大的日志缓冲可以减少磁盘I/O。 

#innodb_log_buffer_size = 8M

#1表示每次事务结束都写日志并刷新磁盘;2表示每次事务写日志但不刷新磁盘(每秒刷新);0(默认值)表示每秒写日志并刷新磁盘。0表示最多丢失1秒的数据,但性能最好。

#innodb_flush_log_at_trx_commit = 1       

#InnoDB行锁导致的死锁等待时间(默认值是50S),可改为30

#innodb_lock_wait_timeout = 50

内存配置相关参数

内存对于MySQL是非常重要的,如何正确的配置MySQL内存参数就显得至关重要了。

  • 确定可以使用的内存的上限,不能超过可用的物理内存
  • 确定MySQL的每个连接使用的内存

sort_buffer_size 排序缓冲区的大小

join_buffer_size 连接缓冲区大小

read_buffer_size 读缓冲区大小,4k的倍数

read_rnd_buffer_size 索引缓冲区的大小

以上4个参数都是为每个线程配置的。

  • 确定需要为操作系统保留多少内存,建议一台机器只装MySQL服务
  • 如何为缓存池分配内存Innodb_buffer_pool_size

    Key_buffer_size 这个参数主要是MyISAM缓冲大小

IO相关参数配置

Innodb I/O相关配置:

  • Innodb_log_file_size 控制单个事务日志的大小
  • Innodb_log_files_in_group 控制事务日志的文件个数
  • 事务日志总大小=Innodb_log_files_in_group * Innodb_log_file_size
  • Innodb_log_buffer_size Innodb日志事务缓冲区大小,通常不用设置非常大
  • Innodb_flush_log_at_trx_commit 刷新日志的频率,值如下
    • 0:每秒进行一次log写入cache,并flush log到磁盘
    • 1 默认:在每次事务提交执行log邪物cache,并flush log到磁盘
    • 2 建议:每次事务提交,执行log数据写入到cache,每秒执行一次flush log到磁盘
  • Innodb_flush_method=O_DIRECT Innodb刷新的方式
  • Innodb_file_per_table = 1 设置后Innodb会为每个表建立一个单独的表空间
  • Innodb_doublewrite = 1 双写缓冲,避免数据没有写完整导致数据损坏。

MyISAM I/O 相关配置:

delay_key_write:

  • OFF:每次写操作后刷新键缓冲中的脏块到磁盘
  • ON: 只对在键表时指定了delay_key_write选项的表使用延迟刷新
  • ALL:对所有MYISAM表都支持延迟键写入

其他常用参数配置

  • sync_binlog 控制MySQL如何向磁盘刷新binlog
  • tmp_table_size 和max_heap_table_size 控制内存临时表的大小
  • max_connections 控制允许的最大连接数