0
点赞
收藏
分享

微信扫一扫

MySQL实战之数据库优化

大沈投资笔记 2022-05-03 阅读 34

MySQL实战之数据库优化

前言

  1. 前边写了一篇博客介绍MySQL的压测,想不想让一台MySQL有更大的吞吐量?想不想根据机器的实际配置调整一下默认参数?比如:Buffer Poll默认是128M,这怎么抗的住10K+的并发?还有配置是不是固定不变的?是不是要结合压测动态调整?
  2. 大家也知道除了优化一台MySQL服务器,还要结合分库分表,加中间映射表,ES等水平扩展来解决高并发,高可用的问题

数据库优化

  1. 如果对配置有疑惑,希望到官网查看具体的参数配置:MySQL官网配置详解

  2. 首先确保服务器是SSD,以确保顺序读写和随机读写的能力

  3. 结合项目需要配置对应的带宽,CPU,内存,要不巧妇难为无米之炊

  4. 首先需要修改mysql可以操作的文件句柄数

    1. 在/etc/security/limits.conf添加

      mysql hard nofile 65535
      mysql soft nofile 65535
      
    2. 在/usr/lib/systemd/system/mysqld.service添加

      LimitNOFILE=65535
      LimitNPROC=65535
      
  5. 开发环境配置(4C8G)

    # 数据库配置
    [mysqld]
    port=3306	# 默认端口号,也可自定义
    bind_address=0.0.0.0	# 运行远程访问
    character_set_server=utf8mb4	# 因为有手机端,可能会存emoji表情
    autocommit=1	# 事务自动提交
    skip_name_resolve=1	# 忽略反向dns解析
    lower_case_table_names=1 # 忽略数据库大小写
    max_connections=60	# 用户的最大连接数
    max_connect_errors=100	# 密码错误超过10次会阻止连接,
    innodb_flush_log_at_trx_commit=2	# redo log和bin log先写入os cache再写入日志,可能会丢失1秒的数据,数据安全要求高的使用默认的1	
    transaction_isolation=READ_COMMITTED	# 设置事务隔离级别是读已提交
    explicit_defaults_for_timestamp=1	# timestamp类型字段不更新为当前时间
    join_buffer_size=8m	# 优化联表查询效率
    tmp_table_size=32m	# 超过该值会利用磁盘文件进行操作,如group by操作
    max_allowed_packet=512m	# 导入数据的限制值
    interactive_timeout=600	# 剔除超过10分钟的连接
    wait_timeout=600 # 等待超时时间10分钟
    read_buffer_size=2m	# 读入缓冲区大小,可以优化全表扫描效率
    read_rnd_buffer_size=8m	# 超过该值会采用随机读取
    sort_buffer_size=4m	# 提高排序和分组的效率
    innodb_page_size=8192	# 数据缓存页的大小
    innodb_buffer_pool_size=256m	# buffer pool的大小
    innodb_buffer_pool_instances=2	# buffer pool的实例数 buffer pool总大小=(chunk大小(默认128m) * buffer pool数量)的倍数	
    innodb_buffer_pool_load_at_startup=0	# 不使用预热
    innodb_buffer_pool_dump_at_shutdown=0	# 关机不用把内存中数据存档
    innodb_lru_scan_depth=500	# lru链表的深度,增加吞吐量
    innodb_lock_wait_timeout=60 # 事务锁超时时间
    innodb_io_capacity_max=1000	# 决定mysql的tps
    innodb_io_capacity=500	# 最大值的一半
    innodb_flush_method=O_DIRECT # innodb缓存直接向磁盘上写
    innodb_file_format=Barracuda	# 兼容性较好
    innodb_file_format_max=Barracuda # 同上
    innodb_flush_neighbors=1	# 快速刷新脏页
    innodb_log_file_size=64m	# 日志文件大小
    innodb_log_buffer_size=16m	# 日志缓存区的大小
    innodb_large_prefix=1	# utf8mb4需要开启
    innodb_thread_concurrency=2 # 和cpu核数相同
    innodb_print_all_deadlocks=1	# 记录死锁信息
    innodb_strict_mode=1	# 严格模式
    slow_query_log=1	# 慢查询
    log_queries_not_using_indexes=1	# 没有走索引的语句
    log_slow_admin_statements=1 # 写入慢查询日志的语句中包含慢速管理语句
    log_throttle_queries_not_using_indexes=50 # 记录的条数
    expire_logs_days=30 # bin log的保留时间
    long_query_time=10 # 超过10秒的会被记录为慢日志
    min_examined_row_limit=1 # 超过100行且大于10s才是慢sql
    master_info_repository=TABLE # 从机保留主节点信息的方式
    relay_log_info_repository=TABLE # 从机保留relay log信息的方式
    innodb_buffer_pool_dump_pct=25 # 保留使用最频繁的数据25%
    innodb_page_cleaners=2 # CPU核数
    innodb_undo_log_truncate=1 # 在线回收undo log
    innodb_max_undo_log_size=1G # undo log的最大值
    log_timestamps=system # 日期格式
    show_compatibility_56=on # 兼容mysql5.6
    tmpdir=/var/temp	# 临时文件的地址
    innodb_log_group_home_dir=/var/log/redolog	# 规范redo log目录
    innodb_undo_directory=/var/log/undolog	# 规范undo log目录
    slow_query_log_file=/var/log/mysqld  # 慢查询日志地址
    
    # 客户端配置
    [client]
    character_set_client=utf8mb4	# 因为有手机端,可能会存emoji表情
    
    # 命令行配置
    [mysql]
    character_set_client=utf8mb4 # 因为有手机端,可能会存emoji表情
    
    # MySQL守护线程
    [mysqld_safe]
    log_error=/var/log/mysqld.log # 错误日志
    pid_file=/var/run/mysqld/mysqld.pid # pid位置
    
  6. 主库配置文件示例(生产环境16C32G)

    # 数据库配置
    [mysqld]
    port=3306	# 默认端口号,也可自定义
    bind_address=0.0.0.0	# 运行远程访问
    character_set_server=utf8mb4	# 因为有手机端,可能会存emoji表情
    autocommit=1	# 事务自动提交
    skip_name_resolve=1	# 忽略反向dns解析
    lower_case_table_names=1 # 忽略数据库大小写
    max_connections=6000	# 用户的最大连接数
    max_connect_errors=10	# 密码错误超过10次会阻止连接,
    innodb_flush_log_at_trx_commit=2	# redo log和bin log先写入os cache再写入日志,可能会丢失1秒的数据,数据安全要求高的使用默认的1	
    transaction_isolation=READ_COMMITTED	# 设置事务隔离级别是读已提交
    explicit_defaults_for_timestamp=1	# timestamp类型字段不更新为当前时间
    join_buffer_size=16m	# 优化联表查询效率
    tmp_table_size=64m	# 超过该值会利用磁盘文件进行操作,如group by操作
    max_allowed_packet=512m	# 导入数据的限制值
    interactive_timeout=600	# 剔除超过10分钟的连接
    wait_timeout=600 # 等待超时时间10分钟
    read_buffer_size=2m	# 读入缓冲区大小,可以优化全表扫描效率
    read_rnd_buffer_size=8m	# 超过该值会采用随机读取
    sort_buffer_size=4m	# 提高排序和分组的效率
    innodb_page_size=8192	# 数据缓存页的大小
    innodb_buffer_pool_size=20G	# buffer pool的大小
    innodb_buffer_pool_instances=16	# buffer pool的实例数 buffer pool总大小=(chunk大小(默认128m) * buffer pool数量)的倍数	
    innodb_buffer_pool_load_at_startup=0	# 不使用预热
    innodb_buffer_pool_dump_at_shutdown=0	# 关机不用把内存中数据存档
    innodb_lru_scan_depth=2000	# lru链表的深度,增加吞吐量
    innodb_lock_wait_timeout=60 # 事务锁超时时间
    innodb_io_capacity_max=8000	# 决定mysql的tps
    innodb_io_capacity=4000	# 最大值的一半
    innodb_flush_method=O_DIRECT # innodb缓存直接向磁盘上写
    innodb_file_format=Barracuda	# 兼容性较好
    innodb_file_format_max=Barracuda # 同上
    innodb_flush_neighbors=1	# 快速刷新脏页
    innodb_log_file_size=64m	# 日志文件大小
    innodb_log_buffer_size=16m	# 日志缓存区的大小
    innodb_large_prefix=1	# utf8mb4需要开启
    innodb_thread_concurrency=16 # 和cpu核数相同
    innodb_print_all_deadlocks=1	# 记录死锁信息
    innodb_strict_mode=1	# 严格模式
    slow_query_log=1	# 慢查询
    log_queries_not_using_indexes=1	# 没有走索引的语句
    log_slow_admin_statements=1 # 写入慢查询日志的语句中包含慢速管理语句
    log_throttle_queries_not_using_indexes=50 # 记录的条数
    expire_logs_days=30 # bin log的保留时间
    long_query_time=10 # 超过10秒的会被记录为慢日志
    min_examined_row_limit=100 # 超过100行且大于10s才是慢sql
    master_info_repository=TABLE # 从机保留主节点信息的方式
    relay_log_info_repository=TABLE # 从机保留relay log信息的方式
    innodb_buffer_pool_dump_pct=25 # 保留使用最频繁的数据25%
    innodb_page_cleaners=16 # CPU核数
    innodb_undo_log_truncate=1 # 在线回收undo log
    innodb_max_undo_log_size=2G # undo log的最大值
    log_timestamps=system # 日期格式
    show_compatibility_56=on # 兼容mysql5.6
    tmpdir=/var/temp	# 临时文件的地址
    innodb_log_group_home_dir=/var/log/redolog	# 规范redo log目录
    innodb_undo_directory=/var/log/undolog	# 规范undo log目录
    slow_query_log_file=/var/log/mysqld  # 慢查询日志地址
    
    # 主从复制
    server_id=1	# 主从复制时使用用来区分不同的实例
    log_bin =mysql_bin # bin log日志名称
    sync_binlog=1 # 主从复制时用,保证数据安全
    binlog_format=row # row数据最全
    binlog_do_db=xxx # 要同步的数据库
    binlog_do_db=xxx.config # 要同步的数据库
    binlog_ignore_db=mysql 	# 不需要同步的数据库
    binlog_ignore_db=information_schema # 不需要同步的数据库
    binlog_ignore_db=performance_schema # 不需要同步的数据库
    binlog_ignore_db=test # 不需要同步的数据库
    
    # 客户端配置
    [client]
    character_set_client=utf8mb4	# 因为有手机端,可能会存emoji表情
    
    # 命令行配置
    [mysql]
    character_set_client=utf8mb4 # 因为有手机端,可能会存emoji表情
    
    # MySQL守护线程
    [mysqld_safe]
    log_error=/var/log/mysqld.log # 错误日志
    pid_file=/var/run/mysqld/mysqld.pid # pid位置
    
  7. 从库配置文件(16C32G)

    # 数据库配置
    [mysqld]
    port=3306	# 默认端口号,也可自定义
    bind_address=0.0.0.0	# 运行远程访问
    character_set_server=utf8mb4	# 因为有手机端,可能会存emoji表情
    autocommit=1	# 事务自动提交
    skip_name_resolve=1	# 忽略反向dns解析
    lower_case_table_names=1 # 忽略数据库大小写
    max_connections=6000	# 用户的最大连接数
    max_connect_errors=10	# 密码错误超过10次会阻止连接,
    innodb_flush_log_at_trx_commit=2	# redo log和bin log先写入os cache再写入日志,可能会丢失1秒的数据,数据安全要求高的使用默认的1	
    transaction_isolation=READ_COMMITTED	# 设置事务隔离级别是读已提交
    explicit_defaults_for_timestamp=1	# timestamp类型字段不更新为当前时间
    join_buffer_size=16m	# 优化联表查询效率
    tmp_table_size=64m	# 超过该值会利用磁盘文件进行操作,如group by操作
    max_allowed_packet=512m	# 导入数据的限制值
    interactive_timeout=600	# 剔除超过10分钟的连接
    wait_timeout=600 # 等待超时时间10分钟
    read_buffer_size=2m	# 读入缓冲区大小,可以优化全表扫描效率
    read_rnd_buffer_size=8m	# 超过该值会采用随机读取
    sort_buffer_size=4m	# 提高排序和分组的效率
    innodb_page_size=8192	# 数据缓存页的大小
    innodb_buffer_pool_size=20G	# buffer pool的大小
    innodb_buffer_pool_instances=16	# buffer pool的实例数 buffer pool总大小=(chunk大小(默认128m) * buffer pool数量)的倍数	
    innodb_buffer_pool_load_at_startup=0	# 不使用预热
    innodb_buffer_pool_dump_at_shutdown=0	# 关机不用把内存中数据存档
    innodb_lru_scan_depth=2000	# lru链表的深度,增加吞吐量
    innodb_lock_wait_timeout=60 # 事务锁超时时间
    innodb_io_capacity_max=8000	# 决定mysql的tps
    innodb_io_capacity=4000	# 最大值的一半
    innodb_flush_method=O_DIRECT # innodb缓存直接向磁盘上写
    innodb_file_format=Barracuda	# 兼容性较好
    innodb_file_format_max=Barracuda # 同上
    innodb_flush_neighbors=1	# 快速刷新脏页
    innodb_log_file_size=64m	# 日志文件大小
    innodb_log_buffer_size=16m	# 日志缓存区的大小
    innodb_large_prefix=1	# utf8mb4需要开启
    innodb_thread_concurrency=16 # 和cpu核数相同
    innodb_print_all_deadlocks=1	# 记录死锁信息
    innodb_strict_mode=1	# 严格模式
    slow_query_log=1	# 慢查询
    log_queries_not_using_indexes=1	# 没有走索引的语句
    log_slow_admin_statements=1 # 写入慢查询日志的语句中包含慢速管理语句
    log_throttle_queries_not_using_indexes=50 # 记录的条数
    expire_logs_days=30 # bin log的保留时间
    long_query_time=10 # 超过10秒的会被记录为慢日志
    min_examined_row_limit=100 # 超过100行且大于10s才是慢sql
    master_info_repository=TABLE # 从机保留主节点信息的方式
    relay_log_info_repository=TABLE # 从机保留relay log信息的方式
    innodb_buffer_pool_dump_pct=25 # 保留使用最频繁的数据25%
    innodb_page_cleaners=16 # CPU核数
    innodb_undo_log_truncate=1 # 在线回收undo log
    innodb_max_undo_log_size=2G # undo log的最大值
    log_timestamps=system # 日期格式
    show_compatibility_56=on # 兼容mysql5.6
    tmpdir=/var/temp	# 临时文件的地址
    innodb_log_group_home_dir=/var/log/redolog	# 规范redo log目录
    innodb_undo_directory=/var/log/undolog	# 规范undo log目录
    slow_query_log_file=/var/log/mysqld  # 慢查询日志地址
    
    # 主从复制
    server_id=2	# 主从复制时使用用来区分不同的实例
    replicate_wild_do_table=xxx.%	# 备份的数据库
    replicate_wild_do_table=xxx_config.% # 备份的数据库
    replicate_wild_ignore_table=test.% # 忽略的数据库
    replicate_wild_ignore_table=mysql.%  # 忽略的数据库
    replicate_wild_ignore_table=information_schema.%  # 忽略的数据库
    replicate_wild_ignore_table=performance_schema.% # 忽略的数据库
    slave-skip-errors=1032,1062,1053,1146,2003 # 1032: 记录不存在 1062:字段值重复,入库失败 1053: 服务没有及时响应启动 或控制请求 1146:数据表不存在 2003MySQL 服务没有启动,请启动该服务。
    read_only=1
    
    # 客户端配置
    [client]
    character_set_client=utf8mb4	# 因为有手机端,可能会存emoji表情
    
    # 命令行配置
    [mysql]
    character_set_client=utf8mb4	# 因为有手机端,可能会存emoji表情
    
    # MySQL守护线程
    [mysqld_safe]
    log_error=/var/log/mysqld.log # 错误日志
    pid_file=/var/run/mysqld/mysqld.pid # pid位置
    
举报

相关推荐

0 条评论