1.1innodb核心参数讲解:
    InnoDB Buffer Pool:
    innodb_buffer_pool_size ## MySQL中最大的内存结构,设置建议在百分之50-75
    innodb_buffer_pool_chunk_size ##分配单元的大小,默认就好
    innodb_buffer_pool_instances ##可以给内存分为几个实例,可以尝试设置一些参数,调解内存的争用
    show global status like ‘%innodb%wait%’; ##要具体真对每个服务器配置,进行压测,看平均IO延时,然后取得当前最佳值。如歌 wait_free这个参数里面有值,就代表现在的内存不够用。
    redo-log:
    innodb_log_buffer_size=33554432 ##磁盘文件大小 512M到4G左右
    innodb_log_file_size ##log大小redo日志文件的大小。
    innodb_log_files_in_group
    innodb_log_group_home_dir

    mysql> show variables like ‘%log_file%’;
    +—————————————-+——————————————————+
    | Variable_name | Value |
    +—————————————-+——————————————————+
    | general_log_file | /data/3306/data/localhost.log |
    | innodb_log_file_size | 50331648 | ##单个大小
    | innodb_log_files_in_group | 2 | ##组数
    | slow_query_log_file | /data/3306/data/localhost-slow.log |
    +—————————————-+——————————————————+
    重启生效:
    [root@db01 data]# /etc/init.d/mysqld restart
    show global status like ‘%innodb%log%’;
    change buffer:
    innodb_change_buffer_max_size 默认25% 辅助索引的内存缓冲区,最多设置innodb_buffer_pool大小的50%
    表空间:
    innodb_data_file_path=ibdata1:100M;ibdata2:100M;ibdata3:100M:autoextend ##ibdat1这个文件,可以分配多个,每个是100M autoextend自动添加ibdata1
    innodb_file_per_table=1
    innodb_undo_tablespaces; ——>3-5个 #打开独立undo模式,并设置undo的个数。
    innodb_max_undo_log_size; #undo日志的大小,默认1G。
    innodb_undo_log_truncate; #开启undo自动回收的机制(undo_purge)。
    innodb_purge_rseg_truncate_frequency; #触发自动回收的条件,单位是检测次数。
    innodb_undo_directory ##undo存放的位置
    innodb_temp_data_file_path=ibtmp1:12M;ibtmp2:128M:autoextend:max:500M

    innodb_io_capacity ##脏页刷新的数量
    innodb_io_capacity_max ##脏页刷新最大的数量
    innodb_max_dirty_pages_pct ##脏页达到百分之90进行刷新到磁盘

    transaction_isolation=RC\RR ##一般互联网使用RC级别就可以了,可以减少锁的争用
    innodb_lock_wait_timeout=10 ##行级锁超时,时间
    innodb_flush_log_at_trx_commit=0/1/2 ## redo日志文件刷新策略
    mysql 双1特性 redo日志刷新参数为1:
    在每次事务提交都会进行刷盘,从内存,到内存缓冲区,立即刷新到磁盘,只有他落盘了才能证明commit成功提交了 1这个参数比较安全
    redo日志刷新参数为2:
    每次事务提交也会让内存缓冲区进行日志的刷新,每秒将内存缓冲区里面的数据写入到磁盘当中,这个有风险如果出现了宕机,会出现秒级别数据的丢失
    1/2对比:
    1只要数据提交成功了redo日志一定在磁盘当中足够的安全,会影响事务的并发量。
    2只要刷新到内存缓冲区当中就认为提交成功了,可以支持很高的并发。
    0每秒刷新到内存缓冲区,在以每秒的速度刷新到磁盘,也可能造成数据的丢失。
    innodb_flush_method=o_direct/fsync ## 控制刷新的模式(redo日志,数据脏页)
    o_direct:
    在刷新数据页的时候,直接进行刷新到磁盘跳过内存缓冲区,redo日志进行落盘时,先刷新到内存缓冲区,在刷新到磁盘这样可以有效的减少磁盘IO,也可以减少内存缓冲区的争用。
    fsync:
    在刷新数据页的时候,先刷新到内存缓冲区,在刷新到磁盘 进行异步刷新,数据页数量很大时,会占用很多内存缓冲区会导致内存缓冲区不够用,可能会出现oom内存溢出的现象。

    mysql> interactive_timeout ##交互式登录连接超时等待参数
    mysql> wait_timeout ##非交互连接超时,连接超时 2880秒会进行超时断开,推荐设置7200秒
    mysql> lock_wait_timeout ##MDL锁等待,默认是一年 推荐设置600秒十分钟
    mysql> innodb_lock_wait_timeout ##行锁等待,行锁记录锁,gap,都会有超时推荐设置为10秒

    扩展:Mini-TRansaction(MTR)
    innodb_lock_wait_timeout=10
    – 定义
    • mini-transaction不属于事务;InnoDB内部使用
    • 对于InnoDB内所有page的访问(I/U/D/S),都需要mini-transaction支持
    – 功能
    • 访问page,对page加latch (只读访问:S latch;写访问:X latch)
    • 修改page,写redo日志 (mtr本地缓存)
    • page操作结束,提交mini-transaction (非事务提交)
    – 将redo日志写入log buffer
    – 将脏页加入Flush List链表
    – 释放页面上的 S/X latch
    – 总结
    • mini-transaction,保证单page操作的原子性(读/写单一page)
    • mini-transaction,保证多pages操作的原子性(索引SMO/记录链出,多pages访问的原子性)
    image.png