高性能MySQL

MySQL技术内幕: InnoDB存储引擎

MySQL 实战 45 讲

公司线上环境:

-- 给业务系统的权限, 如果不允许物理删除, 不给 DELETE 就行
Grants for 数据库名@IP.IP.%
GRANT USAGE ON *.* TO '数据库名'@'IP.IP.%'
GRANT SELECT, INSERT, UPDATE, DELETE ON `数据库名`.* TO 'XXX'@'IP.IP.%'
-- 隔离级别
tx_isolation = REPEATABLE-READ

-- innodb_flush_log_at_trx_commit
-- 0 每次事务提交时都只是把 redo log 留在 redo log buffer 中
-- 1 每次事务提交时都将 redo log 直接持久化到磁盘
-- 2 每次事务提交时都只是把 redo log 写到 page cache 
innodb_flush_log_at_trx_commit = 1 

-- sync_binlog
-- 0 每次提交事务都只 write,不 fsync (如果主机发生异常重启,日志丢失)
-- 1 每次提交事务都会执行 fsync
-- N(N>1) 每次提交事务都 write, 但累积 N 个事务后才 fsync
sync_binlog = 0

-- **内存缓冲池**
innodb_buffer_pool_instances = 8
innodb_buffer_pool_size = 1073741824 -- 1G

-- midpoint位置
-- Buffer Pool 的 LRU list 中 old 部分所占的比例
innodb_old_blocks_pct = 37 

-- 表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端
innodb_old_blocks_time = 1000 

-- 决定 innodb 重做日志缓存池的大小,默认8M
innodb_log_buffer_size = 67108864 --64M

-- 每个线程的binlog cache大小
binlog_cache_size = 2097152 --2M

-- 单个事务最大允许使用的Binlog
max_binlog_cache_size = 18446744073709547520 -- 最大值

--bin log日志每达到设定大小后,会使用新的bin log日志
max_binlog_size = 1073741824 --1G

-- innodb_file_per_table
-- OFF: InnoDB 表的数据和索引都存放在一个表空间
-- ON: 开启独立表文件, InnoDB 表的数据和索引都会以单独的形式存放
innodb_file_per_table = ON

-- redo日志大小
innodb_log_file_size = 268435456 --256M

-- redo日志数量
innodb_log_files_in_group = 3

-- binlog记录格式
binlog_format = ROW

-- 记录所有数据的前后镜像,安全,性能低
binlog_row_image = FULL

-- GTID
gtid_mode = ON
enforce_gtid_consistency = ON
gtid_purged	= "2ea5e3ff-5fd1-11e7-a42b-1866dafae491:1,6b09a523-2098-11ea-b2b6-20040fecb6b9:1-7480678"

-- InnoDB 的并发线程上限 0表示不限制并发线程数量
innodb_thread_concurrency = 0

-- 设置为ON,防止没有where条件的更新删除
sql_safe_updates = OFF

join_buffer_size = 262144
sort_buffer_size = 262144
innodb_sort_buffer_size = 1048576
myisam_sort_buffer_size = 67108864

-- 内存临时表大小限制
tmp_table_size = 67108864
innodb_version = 5.7.14-8
version = 5.7.14-8-log

-- innodb_autoinc_lock_mode
-- 控制含 auto_increment 列的表在插入时, 相关锁行为
-- 0: 所有 insert 都加 auto_inc 锁. 语句执行结束才释放. 影响并发.
-- 1: 普通 insert 语句,自增锁在申请之后就马上释放; 
-- 1: 类似 insert … select 这样的批量插入数据的语句,自增锁还是要等语句结束后才被释放
-- 2: 没有 auto_inc 锁, 性能最好. 但对于同一个语句所得到的 auto_increment 值可能不连续
innodb_autoinc_lock_mode = 1

-- 死锁等待时间, 默认50s
innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = OFF

-- 主机IO能力
innodb_io_capacity = 1000
innodb_io_capacity_max = 2000