zoukankan      html  css  js  c++  java
  • Mysql 性能优化 ( my.cnf )


    简介:

    Mysql 参数优化

    一、Mysql 源码编译参数

    shell > yum -y install gcc gcc-c++ make cmake ncurses-devel zlib-devel bison
    
    shell > cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 
    -DMYSQL_DATADIR=/usr/local/mysql/data 
    -DTMPDIR=/usr/local/mysql/data 
    -DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock 
    -DSYSCONFDIR=/etc/my.cnf 
    -DWITH_MYISAM_STORAGE_ENGINE=1 
    -DWITH_INNOBASE_STORAGE_ENGINE=1 
    -DWITH_FEDERATED_STORAGE_ENGINE=1 
    -DDEFAULT_CHARSET=utf8 
    -DEXTRA_CHARSETS=all 
    -DDEFAULT_COLLATION=utf8_general_ci

    ##  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql      指定 Mysql 安装路径
    ##  -DMYSQL_DATADIR=/usr/local/mysql/data          指定 Mysql 数据目录
    ##  -DTMPDIR=/usr/local/mysql/data                        指定 Mysql 临时目录
    ##  -DMYSQL_UNIX_ADDR                                      指定 Mysql socket
    ##  -DSYSCONFDIR=/etc/my.cnf                              指定 Mysql 配置文件
    ##  -DWITH_MYISAM_STORAGE_ENGINE=1             安装 MyISAM 存储引擎
    ##  -DWITH_INNOBASE_STORAGE_ENGINE=1          安装 Innodb 存储引擎
    ##  -DWITH_FEDERATED_STORAGE_ENGINE=1        安装 Federated 存储引擎
    ##  -DDEFAULT_CHARSET=utf8                               指定默认字符集为 utf8
    ##  -DEXTRA_CHARSETS=all                                   安装扩展字符集
    ##  -DDEFAULT_COLLATION=utf8_general_ci            默认排序规则 utf8_general_ci

    Cmake 参数:http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html

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

    二、my.cnf 配置文件

    ## global_buffers 在内存中缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能
    
    ## 计算公式:Innodb_buffer_pool_size + Innodb_additional_mem_pool_size + Innodb_log_buffer_size + key_buffer_size + query_cache_size
    
    ## per_thread_buffers 线程独享内存大小
    
    ## 计算公式( read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size + binlog_cache_size )* max_connections
    
    ## 注意:global_buffers + per_thread_buffers 不能大于实际物理内存,否者并发量大时会造成内存溢出、系统死机 !
    
    [client]
    port = 3306
    socket = /usr/local/mysql/data/mysql.sock
    
    ## 定义客户端连接信息,端口号、socket 存放位置
    
    [mysqld]
    port = 3306
    socket = /usr/local/mysql/data/mysql.sock
    basedir = /usr/local/mysql
    datadir = /usr/local/mysql/data
    temdir = /usr/local/mysql/data
    
    ## Mysql 基本信息,端口号、socket、安装目录、数据存放目录、临时目录
    
    # skip-name-resolve
    
    ## 禁止 Mysql 对外部连接进行 DNS 解析,加快连接速度。开启后所有远程连接主机只能使用 IP 的方式
    
    skip_external_locking
    
    ## 避免 Mysql 外部锁定,减少出错几率、增强稳定性
    
    local-infile = 0
    
    ## 禁止 SQL 读取本地文件
    
    character-set-server = utf8
    
    ## 默认字符集 utf8
    
    default-storage-engine = innodb
    
    ## 默认存储引擎
    
    # general_log = on
    
    ## 开启查询日志,一般选择不开启,因为查询日志记录很详细,会增大磁盘 IO 开销,影响性能
    
    # general_log_file = /usr/local/mysql/data/mysql.log
    
    ## 查询日志存放位置及文件名
    
    log-error = /usr/local/mysql/data/error.log
    
    ## 错误日志位置跟文件名
    
    # slow_query_log = on
    
    ## 开启慢查询日志,开启后将会记录执行时间超过 long_query_time 参数值的 SQL 语句( 一般临时开启即可 )
    
    # long_query_time = 2
    
    ## 定义执行时间超过多少秒为慢查询,默认 10s
    
    # slow_query_log_file = /usr/local/mysql/data/slow.log
    
    ## 定义慢查询日志存放位置
    
    # server-id = 1
    
    ## Mysql Server 唯一标识,用来做主同同步( 主从时开启 )
    
    log-bin = mysql-bin
    
    ## 开启 binlog ( 二进制 ) 日志,主要用来做增量备份跟主从同步
    
    binlog_format = mixed
    
    ## Mysql binlog 的日志格式,Statement、ROW 跟 Mixed( 混合模式 )
    
    binlog_cache_size = 2M
    
    ## 二进制日志缓冲大小,此参数是为每 Session 单独分配的,当一个线程开始一个事务时,Mysql 就会为此 Session 分配一个 binlog cache,当这个事务提交时,binlog cache 中的数据被写入 binlog 文件
    ## 通过 show status like 'binlog_cache%'; 来查看使用 binlog cache 的次数及使用磁盘的次数
    
    sync_binlog = 0
    
    ## 这个参数对 Mysql 系统来说很重要,不仅影响到 binlog 对 Mysql 所带来的性能损耗,还影响到 Mysql 中数据的完整性。
    ## 值为 0 时代表事务提交后,Mysql 不做 fsync 之类的磁盘同步指令刷新 binlog_cache 中的信息到磁盘,而让 Filesystem 自行决定什么时候同步,或者 cache 满了之后才同步磁盘。
    ## 值为 n 时代表进行 n 次事务提交后,Mysql 将进行一次 fsync 之类的磁盘同步指令来将 binlog_cache 中的数据强制写入磁盘。
    ## 系统默认将此参数设置为 0 ,即不做任何强制性的磁盘刷新指令,性能最好,但是风险也最大。当系统崩溃时 binlog_cache 中的所有 binlog 信息都会丢失。
    ## 而设置为 1 时,是最安全但是性能损耗最大。当系统崩溃时,最多丢失 binlog_cache 中未完成的一个事务,对实际数据没有实质性的影响。
    
    expire_logs_days = 30
    
    ## 保留 30 天的 binlog 日志,系统重启、执行 flush logs 或 binlog 日志文件大小达到上限时删除 binlog 日志
    
    back_log = 500
    
    ## Mysql 连接请求队列存放数,当某一时刻客户端连接请求过多,造成 Mysql Server 无法为其建立连接时存放的数量,最大 65535( 增大时需同时调整 OS 级别的网络监听队列限制 )
    
    max_connections = 1000
    
    ## Mysql 最大连接数,直接影响 Mysql 应用的并发处理能力( 500~1000 是个比较合适的值,注意每建立的连接都会占用一定的内存空间,直到连接被关闭才释放内存 )
    
    wait_timeout = 100
    interactive_timeout = 100
    
    ## 服务器关闭非交换连接之前等待活动的秒数,默认 28800 秒( 注意:在 my.cnf 中修改这个参数需要配合 interactive_timeout (超时间隔)参数一起修改,否则不生效)
    ##( Mysql 处理完一条连接后所等待释放的时间,如果并发很高,默认设置会导致最大连接被占满,出现 "too many connections" 错误 )
    ##( 如果这个值很低,比如 5 ,可能会导致出现 "ERROR 2006 (HY000) MySQL server has gone away" 的错误,出现这个错误还有可能是 max_allowed_packet 设置过小 )
    ## 真实案例
    
    max_connect_errors = 1000
    
    ## 最大连接失败次数,跟性能没有太大关系,主要跟安全方面有关( 达到此上限后会无条件阻止其连接数据库 ,默认 100 )
    
    connect_timeout = 20
    
    ## 连接超时时间为 20 秒
    
    max_allowed_packet = 16M
    
    ## 网络传输中一次消息量的最大值,默认 4M ,必须设为 1024 的整倍数
    
    table_open_cache = 2000
    
    ## 打开文件描述符的缓存个数,防止系统频繁打开、关闭描述符而浪费资源( 对性能有影响,默认 2000 )
    
    read_buffer_size = 512K
    
    ## Mysql 读入缓冲区大小,对表进行顺序扫描的请求将分配一个读入缓冲区,Mysql 会为其分配一段内存缓冲区( 默认 128K ,此参数为每线程分配 )
    
    read_rnd_buffer_size = 512K
    
    ## Mysql 随机 Query 缓冲区大小,当按任意顺序读取行时,将分配一个随机读取缓冲区。如进行排序查询时,Mysql 会首先扫描该缓冲,避免磁盘搜索,提高查询速度( 默认 256K ,该缓冲也是为每线程分配 )
    
    sort_buffer_size = 512K
    
    ## 系统中对数据进行排序时使用的 buffer ,如果系统中排序比较大,且内存充足、并发不大时,可以适当增大此值( 默认 256K ,此参数为每线程分配独立的 buffer )
    
    join_buffer_size = 512K
    
    ## join 为 ALL、index、rang 或 index_merge 时使用的 buffer( 默认 256K ,每 Thread 都会建立自己独立的 buffer )
    
    thread_stack = 256K
    
    ## 参数表示每线程的堆栈大小
    
    thread_cache_size = 64
    
    ## Thread Cache 池中存放的连接线程数( 此池中的线程不是启动服务时就创建的,而是随着连接线程的创建和使用,逐渐将用完的线程存入其中,达到此值后将不再缓存连接线程 )
    ## 缓存命中率计算公式:Thread_Cache_Hit = ( Connections - Thread_created ) / Connections * 100%
    ## 系统运行一段时间后,Thread Cache 命中率应该保持在 90% 以上
    
    explicit_defaults_for_timestamp = 1
    
    ## 如果此参数不开启,error_log 中会有警告信息
    
    query_cache_type = 1
    
    ## 是否启用 query_cache ,0 为不使用( 若要关闭 query_cache 时,需同时将 query_cache_size 、query_cache_limit 设为 0 )
    
    query_cache_size = 32M
    
    ## 查询缓冲大小,当重复查询时会直接从该缓冲中获取,但是当所查询表有改变时,缓冲的查询将失效( 频繁写入、更新、高并发的环境下建议关闭此缓冲 )
    
    query_cache_limit = 1M
    
    ## 单个查询所能够使用的缓冲区大小
    
    ft_min_word_len = 1
    
    ## 使用全文索引最小长度
    
    transaction_isolation = REPEATABLE-READ
    
    ## 事务隔离级别,为了有效保证并发读取数据的正确性( 默认 Repeatables Read 即:可重复读 )
    ## Innodb 有四种隔离级别:Read Uncommitted( 未提交读 )、Read Committed( 已提交读 )、Repeatable Read( 可重复读 )、Serializable( 可序列化 )
    
    tmp_table_size = 32M
    
    ## 临时表大小
    
    key_buffer_size = 32M
    
    ## 用来缓存 MyISAM 存储引擎的索引( 默认 8M ,如果使用 Innodb 存储引擎,此值设为 64M 或更小 )
    ## 计算公式:key_reads / key_read_requests * 100% 的值小于 0.1%
    
    ## Innodb 存储引擎相关参数
    
    innodb_file_per_table = 0
    
    ## 关闭独享表空间,使用共享表空间
    
    innodb_buffer_pool_size = 256M
    
    ## Innodb 存储引擎核心参数,用于缓存 Innodb 表的索引、数据( 默认 128M ,单独使用 Innodb 存储引擎且单一 Mysql 服务时建议设为物理内存的 70% - 80 % )
    ## 可以通过 show status like 'innodb_buffer_pool_%'; 来获取 innodb buffer pool 的实时状态信息
    ## Innodb_buffer_pool_pages_total 总共的 pages( Innodb 存储引擎中所有数据存放最小物理单位 page ,每个 page 默认为 16KB )
    ## Innodb_buffer_pool_pages_free  空闲的 pages
    ## Innodb_buffer_pool_pages_data  有数据的 pages
    ## Innodb_buffer_pool_read_requests  总共的 read 请求次数
    ## Innodb_buffer_pool_reads  读取物理磁盘读取数据的次数,即:在 buffer pool 中没有找到
    ## Innodb_buffer_pool_wait_free  因 buffer 空间不足而产生的 wait_free
    ## Innodb_buffer_pool_read_ahead_rnd  记录进行随机读的时候产生的预读次数
    ## Innodb_buffer_pool_read_ahead_seq  记录连续读的时候产生的预读次数
    ## Innodb_buffer_pool_size  使用率 = innodb_buffer_pool_pages_data / innodb_buffer_pool_pages_total * 100%
    ## Innodb_buffer_pool_read  命中率 = ( innodb_buffer_pool_read_requests - innodb_buffer_pool_reads )/ innodb_buffer_pool_read_requests * 100%
    
    innodb_use_sys_malloc = 1
    
    ## 使用系统自带的内存分配器,替代 innodb_additional_mem_pool_size 参数
    
    innodb_data_file_path = ibdata1:512M:autoextend
    
    ## 指定一个大小为 512M 的、可扩展的 ibdata1 数据文件
    
    innodb_read_io_threads = 4
    innodb_write_io_threads = 4
    
    ## Innodb 使用后台线程处理数据页上的 IO 请求,根据 CPU 核数修改,默认 4
    
    innodb_thread_concurrency = 0
    
    ## Innodb 线程并发数,0 为不限制,默认 0
    
    innodb_flush_log_at_trx_commit = 2
    
    ## Innodb 事务日志刷新方式,0 为每隔一秒 log thread 会将 log buffer 中的数据写入到文件,并通知文件系统进行文件同步 flush 操作,极端情况下会丢失一秒的数据
    ## 1 为每次事务结束都会触发 log thread 将 log buffer 中的数据写入文件并通知文件系统同步文件,数据最安全、不会丢失任何已经提交的数据
    ## 2 为每次事务结束后 log thread 会将数据写入事务日志,但只是调用了文件系统的文件写入操作,并没有同步到物理磁盘,因为文件系统都是有缓存机制的,各文件系统的缓存刷新机制不同
    ## 当设为 1 时是最为安全的,但性能也是最差的。0 为每秒同步一次,性能相对高一些。设为 2 性能是最好的,但故障后丢失数据也最多( OS 跟主机硬件、供电足够安全可以选择,或对数据少量丢失可以接受 )。
    
    innodb_log_buffer_size = 8M
    
    ## 事务日志所使用的缓冲区。Innodb 在写事务日志时,为了提高写 Log 的 IO 性能,先将信息写入 Innodb Log Buffer 中,当满足 Innodb_flush_log_trx_commit 参数或日志缓冲区写满时,再将日志同步到磁盘中。
    ## 默认 8M ,一般设为 16~64M 即可,可以通过 show status like 'innodb_log%'; 查看状态
    
    innodb_buffer_pool_dump_at_shutdown = 1
    
    ## 关闭数据库时把热数据 dump 到本地磁盘。
    
    innodb_buffer_pool_dump_now = 1
    
    ## 采用手工方式把热数据 dump 到本地磁盘。
    
    innodb_buffer_pool_load_at_startup = 1
    
    ## 启动时把热数据加载到内存。
    
    innodb_buffer_pool_load_now = 1
    
    ## 采用手工方式把热数据加载到内存。
    
    ## 以上四条参数会快速预热 Buffer_pool 缓冲池,当机器正常重启后,热数据还保留在内存中,避免瞬间连接数爆满导致机器死机。
    
    [mysqldump]
    quick
    max_allowed_packet = 4M
    
    ## 使用 mysqldump 工具备份数据库时,当某张表过大时备份会报错,需要增大该值( 增大到大于表大小的值 )
  • 相关阅读:
    DC中为什么要用Uniquify?
    hdu 1596 find the safest road
    hdu2112 HDU Today
    hdu 2066 一个人的旅行
    poj 3026 Borg Maze
    poj 1979 Red and Black
    poj 1321 棋盘问题
    hdu 1010 Tempter of the Bone
    hdu 4861 Couple doubi
    codeforces584B Kolya and Tanya
  • 原文地址:https://www.cnblogs.com/wangxiaoqiangs/p/5500675.html
Copyright © 2011-2022 走看看