Mysql 优化
印象深刻的是刚进入一家公司,给了一个 excel,里面的内容是线上慢查询的 sql。因为 sql 太长过于复杂,然后就开启了顺着 sql 梳理业务的模式。
这里只是单纯的优化 sql,但出现系统慢的情况,IO 优化应该按照以下思路进行。
优化思路
每个人理解的性能优化都不一样,对于数据库的性能优化,我理解的就是响应时间更短。
硬件层面
cpu。使用更快 CPU,甚至更多的 CPU,特别是 cpu 一级二级缓存大小
内存读写速度
硬盘读写速度
网络 IO 速度
软件层面
操作系统。unix 更快更安全更稳定。
文件系统。ext4 顺序读写更好,随机若些。NTFS 对于频繁修改的数据容易产生磁盘碎片。
硬盘调度算法
虚拟内存设置
以上偏硬件的优化内容,这些和基础运维和费用成本有直接关系。
mysql 服务器配置优化
innnodb 缓冲池
show innodb status 可以查看脏页的刷新量:Inodbbuffer_pool_pages_dirty
缓冲池过大,很多数据在内存里面,查询起来是快一些。当需要刷新到磁盘到时候会很慢,预热和关闭大时间都会变长。缓冲池过小,刷盘都时间变快,但是内存里的数据少了,查询变慢。
可以监控 Inodbbuffer_pool_pages_dirty 状态变量或者使用 innotop 来监控 SHOW INNODB STATUS 来观察脏页的刷新量。 更小的 innodb_max dirty_pages_pct 变量值并不保证 InnoDB 将在缓冲池中保持更少的脏页。它只是控制 InnoDB 是否可以“偷懒(Lazy)” 的阈值。InnoDB 默认通过一个 后台线程来刷新脏页,并且会合并写人,更高效地顺序写出到磁盘。这个行为之所以被称为 “偷懒 (Lazy)”,是因为它使得 InnoDB 延迟了缓冲池中刷写脏页的操作,直到一些其他数据必须使用空间时才刷写 。当脏页的百分比超过这个阈值 ,InnoDB 将快速地刷写脏页,尝试让脏页的数量更低。当事务日志没有足够的空间剩余时,InnoDB 也将进人“激烈刷写(FuriousFlushing)”模式,这就是大日志可以提升性能的一个原因。
InnoDB 怎样刷新日志缓冲。当 InnoDB 把日志缓冲刷新到磁盘日志文件时,先会使用 一 个 Mutex 锁住缓冲区,刷新到所需要的位置,然后移动剩下的条目到缓冲区的前面。当 Mutex 释放时,可能有超过一个事务已经准备好刷新其日志记录。InnoDB 有一个 GroupC ommit 功能,可以在一个 I/0 操作内提交多个事务。
日志缓冲必须呗刷新到磁盘,这样才能保证提交的事务被完全持久化。如果和持久化相比,更在乎性能,那么就可以调整 innodb_flush_1og_at_trxcommit 来控制 redolog 缓冲区的刷新频率。innodb_flush_1og_at_trxcommit 可配置选项
双写缓冲
为了防止把缓冲区数据写入磁盘的时候系统发生故障、断电等因素,导致数据不完整的情况,所以有了双写缓冲。
实际是指在写入磁盘之前,先把这些内存中的数据顺序写入到双写缓冲(磁盘中顺序文件),写入成功以后才会写入数据磁盘。
在数据库启动和恢复过程中,InnoDB 会检查数据文件中的数据页是否完整。如果发现某一个数据页有问题,就会从双写缓冲中读取对应的完整的数据副本。这样就可以保证数据的完整性。
是要两次写入磁盘,但这个双写缓冲是顺序写入,速度还可以。
innodb 并发控制
innodb_thread_concurrency 可以控制一次性能有多少个线程进入到内核,0 表示不限制。
因为大多数是磁盘 IO 操作,所以建议设置值=CPU * 磁盘数量 * 2
concurrent_insert 可以控制 myisam 并发插入的线程数。
优化大数据
blob 和 text 类型的数据,尽量不用和其他字段在一起使用。如果一定要使用,必须做到和其他表隔离。
排序优化
当排序的数据行长度不超过 max_length_for_sort_data 时,会使用单路排序;如果排序数据的长度超过 max_length_for_sort_data 时,会使用多路排序;所以,配置该字段会影响排序算法选择。
其他参数
temp_table_size 控制临时表大小;max_connections 最大连接数;thread_cache_size 内存池大小;innodb_io_capacity 每秒多少个 IO 操作;innodb_buffer_pool_size inno_db_file_size 非常重要,如果你不了解,可以自己学习一下 mysql 的 innodb 引擎;
文章转载自:Eular
评论