innodb 以前不支持高并发, 在搞病房下就是悲剧, 全部卡在 mutex(缓冲池 mutex)上, 现在通过线程调度器控制线程怎么进入内核访问数据, 参数为 innodb_thread_concurrency, 它有计算公式: CPU 数量 * 磁盘数量 * 2.
如果无法进入内核会休眠 innodb_thread_sleep_delay 微妙. 还有一个参数成为高并发瓶颈: innodb_commit_concurrency, 就是提交的时候, 如果设置太小, 容易导致大量线程冲突, 最后通过线程池 (经验值: thread_pool_size 线程组数量, 默认 16, 建议 16-36, 最好 24-36, 值的范围 1-64, 线程组数量跟 CPU 相当. thread_pool_stall_limit 意思是这个 SQL 占用多长时间, 该让给其他人, 较低的值允许线程更快启动起来, 避免死锁, 较高的值适合长时间运行的 SQL 语句) 限制并发.
myisam 设置 concurrent_insert(0 不允许, 1 允许默认值, 只有表中没有空洞, 2 强制并发插入到表的尾末尾)是否允许并发插入.
如果查询涉及到 blob 或者 text 值, 又需要使用临时表, 不管多小, 都会在磁盘上创建临时表, 这样效率很低, 但是通过 substring 函数转为 varchar, 或者让临时表更快一些(基于内存的文件系统, 在 Linux 上是 tmpfs), 或者调大 innodb 日志缓冲大小.
影响 MySQL 排序的两个值(max_length_for_sort_data 为每行排序数据创建固定大小的缓冲跟定义的最大长度比较和 max_sort_length 必须用 blob 和 text 排序的时候, 只使用前缀).
数据库服务器基本配置: tmp_table_size,max_heap_table_size,max_connections,thread_cache_size,table_cache_size. 安全和稳定的设置: expire_logs_days,max_allowed_packet,max_connect_errors,sql_mode,sysdate_IS_now.
下面的选项控制负责复制行为, 防止备库出问题: read_only,skip_slave_start,slave_net_timeout,sync_master_info,sync_relay_log,sync_relay_log_info.innodb 高级配置: innodb_buffer_pool_instances,innodb_autoinc_lock_mode,innodb_io_capacity,innodb_read_io_threads,innodb_write_io_threads,innodb-strict_mode. 但是最重要是: innodb_buffer_pool_size 和 innodb_log_file_size.
顺序 io 比随机 io 快.
MySQL 复制流程: 在主库上把数据更改记录到二进制日志 (binary log) 中, 备库将主库上的日志复制到自己的中继日志 (relay log) 中, 使用的是 io 线程, 备库读取中继日志中的事件, 将其重放到备库数据库中, 使用的是 SQL 线程, 实现获取事件和回放事件解藕, 允许两个线程异步进行, 但是在主库上并发运行的查询, 在备库上只能串行执行, 因为只有一个 SQL 线程重放中继日志事件. 基于行的复制优于基于语句的复制. 复制拓扑中的主动 - 被动模式下的主 - 主复制比较好用, 执行 alter table 可能锁住整个表, 阻塞对表的读和写, 但是在主 - 主配置下, 可以先停止主动服务器上的备库复制线程(这样就不会在被动服务器上执行任何更新), 然后在被动服务器上执行. alter 操作, 交换角色, 最后在主动服务器上启动复制线程, 这个服务器读取中继日志并执行 alter 语句, 这可能花费很长时间, 但是不要紧, 因为该服务器没有为任何活跃查询提供服务.
怎么配置: 1 确保两台服务器有相同数据, 2 启用二进制日志, 选择唯一的服务器 ID 并, 创建复制账号, 3 启用备库更新的日志记录, 后面会看到, 这是故障转移和故障恢复的关键, 4 把被动服务器配置成. 只读, 防止可能与主动服务器上的更新产生冲突, 这一点可选, 5 启动每个服务器的 MySQL 实例, 6 将每个主库设置为对方的备库, 使用新创建的二进制日志开始工作. 还有一种复制拓扑叫拥有备库的主主复制, 优点是增加了冗余, 对应不同地理位置的复制拓扑, 能够消除站点单点失效的问题, 像往常一样将读查询分配到备库上, 当主库失效时, 备库代替主库还是可行的, 或者把备库指向一个不同的主库, 但是有点复杂.
系统变量 show variables, 服务器变量的名字和值 show status(二进制日志 binlog_cache_use 和 binlog_cache_disk_use, 临时表和文件的计数 show global temporary tables;show status like 'creat%';, 排序 sort,table_locks_immediate 和 table_locks_waited). 大文件传输: gzip -c /backup/mydb/mytable.MYD | SSH root@server2 "gunzip -c - /var/lib/mytable.MYD", 也可以在 gzip 上增加选项 - l, 使其压缩更快, 如果想获得更高的压缩率而且速度很快用 bzip 代替 gzip. 如果不需要加密, 可以使用 nc 代替 SSH, 还有其他复制方式如 rsync.
来源: https://www.cnblogs.com/nizuimeiabc1/p/12862438.html