写点什么

Mysql 优化

作者:EquatorCoco
  • 2024-12-13
    福建
  • 本文字数:1624 字

    阅读完需:约 5 分钟

印象深刻的是刚进入一家公司,给了一个 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

原文链接:https://www.cnblogs.com/euler-blog/p/18603552

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
Mysql优化_MySQL_EquatorCoco_InfoQ写作社区