内存相关配置:
-
为每个线程分配的内存:
sort_buffer_size 排序缓冲
join_buffer_size 参与join的每一个表都需要一个join buffer
read_buffer_size 是MySQL读入缓冲区的大小,将对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区
read_rnd_buffer_size 是MySQL的随机读缓冲区大小,当按任意顺序读取行时(列如按照排序顺序)将分配一个随机读取缓冲区 -
为缓存池分配内存:
innodb_buffer_pool_size
总内存 -(每个线程所需要的内存*连接数)- 系统保留内存)
key_buffer_size(MyIsam使用的参数)
可以通过select sum(index_length) from information_schema.tables where engine='myisam'
IO相关参数:
为了减少提交事务时所产生的IO开销,Innodb使用了预写日志的方式,事务提交的时候会写到事务日志中,而不是每次把修改数据刷新到数据文件中,这样做可以提高IO的性能,因为事务的修改是数据和索引文件通常会映射到表空间的随机位置,所以刷新数据变更到数据文件会产生大量的随机IO,而记录日志只是顺序IO,所以相比于刷新脏数据到数据文件系统来说,记录事务日志的方法要快很多。一旦事务日志安全写入到磁盘中,事务就算持久化了,即使变更还没有写入到数据文件,服务器发生了宕机,我们可以通过事务日志恢复已经提交的事务。
innodb_log_file_size控制了单个事务日志的大小
innodb_log_files_in_group控制了事务日志的个数
事务日志总大小=innodb_log_file_size*innodb_log_files_in_group
事务日志不是每次提交都写入到文件中,而是写入到缓冲区中,innodb_log_buffer_size是缓冲区大小,这个值不必设置的太大,因为一般情况下,1s钟就会刷新一次,设置32MB到128MB就可以了。刷新频率如何设置?可以通过Innodb_flush_log_at_trx_commit来控制,0表示每秒进行一次log写入cache,并flush log到磁盘。1(默认)表示在每次事务提交执行log写入cache,并flush log到磁盘2(建议):每次事务提交,执行log数据写入到cache,每秒执行一次flush log到磁盘。
Innodb I/O相关配置:
Innodb_flush_method=O_DIRECT 确定日志及数据文件如何write、flush
O_DIRECT打开文件,则读/写操作都会跳过OS cache,直接在device(disk)上读/写。因为没有了OS cache,所以会O_DIRECT降低文件的顺序读写的效率
Innodb_file_per_table=1
Innodb_doublewrite=1
MySQL默认数据页大小是16K,而我们通常文件系统数据页大小是4K。正是由于这二个原因导致了仅仅依靠redo log在某些情况下是不能把有问题的page修复的。假设数据库page size和文件系统一致,都是4K。那么数据库从内存中写回1个page到磁盘时,发生宕机,这1个page要么写回成功,要么写回不成功,如果不成功,重启的时候通过redo log,重写一次就可以了。当现在的问题是数据库page size是16K,也就是说我写1个page到磁盘,需要4次IO操作,假如我前2次IO操作成功,而后2次IO操作突然宕机,那么这个page在磁盘里就出现数据不一致了
MyISAM I/O相关配置
delay_key_write
OFF:每次写操作后刷新键缓冲中的脏块到磁盘
ON:只对在键表时指定了delay_key_write选项的表使用延迟刷新
ALL:对所有MYISAM表都使用延迟键写入
Mysql服务器参数
- sync_binlog 控制mysql如何向磁盘刷新binlog
- tmp_table_size 和 max_heap_table_size控制内存临时表大小
- max_connections控制允许的最大连接数
数据库设计对性能的影响
- 过分的反范式化为表建立太多的列
- 过分的范式化造成太多的表关联
- 在OLTP环境中使用不恰当的分区表
- 使用外键保证数据的完整性
网友评论