mysql 优化下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | 比较全面的MySQL优化参考(下篇) 8 条回复 本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是下篇。 3 、MySQL层相关优化 3.1 、关于版本选择 官方版本我们称为ORACLE MySQL,这个没什么好说的,相信绝大多数人会选择它。 我个人强烈建议选择Percona分支版本,它是一个相对比较成熟的、优秀的MySQL分支版本,在性能提升、可靠性、管理型方面做了不少改善。它和官方ORACLE MySQL版本基本完全兼容,并且性能大约有 20 % 以上的提升,因此我优先推荐它,我自己也从 2008 年一直以它为主。 另一个重要的分支版本是MariaDB,说MariaDB是分支版本其实已经不太合适了,因为它的目标是取代ORACLE MySQL。它主要在原来的MySQL Server层做了大量的源码级改进,也是一个非常可靠的、优秀的分支版本。但也由此产生了以GTID为代表的和官方版本无法兼容的新特性(MySQL 5.7 开始,也支持GTID模式在线动态开启或关闭了),也考虑到绝大多数人还是会跟着官方版本走,因此没优先推荐MariaDB。 3.2 、关于最重要的参数选项调整建议 建议调整下面几个关键参数以获得较好的性能(可使用本站提供的my.cnf生成器生成配置文件模板): 1 、选择Percona或MariaDB版本的话,强烈建议启用thread pool特性,可使得在高并发的情况下,性能不会发生大幅下降。此外,还有extra_port功能,非常实用, 关键时刻能救命的。还有另外一个重要特色是 QUERY_RESPONSE_TIME 功能,也能使我们对整体的SQL响应时间分布有直观感受; 2 、设置default - storage - engine = InnoDB,也就是默认采用InnoDB引擎,强烈建议不要再使用MyISAM引擎了,InnoDB引擎绝对可以满足 99 % 以上的业务场景; 3 、调整innodb_buffer_pool_size大小,如果是单实例且绝大多数是InnoDB引擎表的话,可考虑设置为物理内存的 50 % ~ 70 % 左右; 4 、根据实际需要设置innodb_flush_log_at_trx_commit、sync_binlog的值。如果要求数据不能丢失,那么两个都设为 1 。如果允许丢失一点数据,则可分别设为 2 和 10 。而如果完全不用care数据是否丢失的话(例如在slave上,反正大不了重做一次),则可都设为 0 。这三种设置值导致数据库的性能受到影响程度分别是:高、中、低,也就是第一个会另数据库最慢,最后一个则相反; 5 、设置innodb_file_per_table = 1 ,使用独立表空间,我实在是想不出来用共享表空间有什么好处了; 6 、设置innodb_data_file_path = ibdata1: 1G :autoextend,千万不要用默认的 10M ,否则在有高并发事务时,会受到不小的影响; 7 、设置innodb_log_file_size = 256M ,设置innodb_log_files_in_group = 2 ,基本可满足 90 % 以上的场景; 8 、设置long_query_time = 1 ,而在 5.5 版本以上,已经可以设置为小于 1 了,建议设置为 0.05 ( 50 毫秒),记录那些执行较慢的SQL,用于后续的分析排查; 9 、根据业务实际需要,适当调整max_connection(最大连接数)、max_connection_error(最大错误数,建议设置为 10 万以上,而open_files_limit、innodb_open_files、table_open_cache、table_definition_cache这几个参数则可设为约 10 倍于max_connection的大小; 10 、常见的误区是把tmp_table_size和max_heap_table_size设置的比较大,曾经见过设置为 1G 的,这 2 个选项是每个连接会话都会分配的,因此不要设置过大,否则容易导致OOM发生;其他的一些连接会话级选项例如:sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size等,也需要注意不能设置过大; 11 、由于已经建议不再使用MyISAM引擎了,因此可以把key_buffer_size设置为 32M 左右,并且强烈建议关闭query cache功能; 3.3 、关于Schema设计规范及SQL使用建议 下面列举了几个常见有助于提升MySQL效率的Schema设计规范及SQL使用建议: 1 、所有的InnoDB表都设计一个无业务用途的自增列做主键,对于绝大多数场景都是如此,真正纯只读用InnoDB表的并不多,真如此的话还不如用TokuDB来得划算; 2 、字段长度满足需求前提下,尽可能选择长度小的。此外,字段属性尽量都加上NOT NULL约束,可一定程度提高性能; 3 、尽可能不使用TEXT / BLOB类型,确实需要的话,建议拆分到子表中,不要和主表放在一起,避免SELECT * 的时候读性能太差。 4 、读取数据时,只选取所需要的列,不要每次都SELECT * ,避免产生严重的随机读问题,尤其是读到一些TEXT / BLOB列; 5 、对一个VARCHAR(N)列创建索引时,通常取其 50 % (甚至更小)左右长度创建前缀索引就足以满足 80 % 以上的查询需求了,没必要创建整列的全长度索引; 6 、通常情况下,子查询的性能比较差,建议改造成JOIN写法; 7 、多表联接查询时,关联字段类型尽量一致,并且都要有索引; 8 、多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不一定是全表数据量小的)作为驱动表; 9 、多表联接并且有排序时,排序字段必须是驱动表里的,否则排序列无法用到索引; 10 、多用复合索引,少用多个独立索引,尤其是一些基数(Cardinality)太小(比如说,该列的唯一值总数少于 255 )的列就不要创建独立索引了; 11 、类似分页功能的SQL,建议先用主键关联,然后返回结果集,效率会高很多; 3.3 、其他建议 关于MySQL的管理维护的其他建议有: 1 、通常地,单表物理大小不超过 10GB ,单表行数不超过 1 亿条,行平均长度不超过 8KB ,如果机器性能足够,这些数据量MySQL是完全能处理的过来的,不用担心性能问题,这么建议主要是考虑ONLINE DDL的代价较高; 2 、不用太担心mysqld进程占用太多内存,只要不发生OOM kill和用到大量的SWAP都还好; 3 、在以往,单机上跑多实例的目的是能最大化利用计算资源,如果单实例已经能耗尽大部分计算资源的话,就没必要再跑多实例了; 4 、定期使用pt - duplicate - key - checker检查并删除重复的索引。定期使用pt - index - usage工具检查并删除使用频率很低的索引; 5 、定期采集slow query log,用pt - query - digest工具进行分析,可结合Anemometer系统进行slow query管理以便分析slow query并进行后续优化工作; 6 、可使用pt - kill杀掉超长时间的SQL请求,Percona版本中有个选项 innodb_kill_idle_transaction 也可实现该功能; 7 、使用pt - online - schema - change来完成大表的ONLINE DDL需求; 8 、定期使用pt - table - checksum、pt - table - sync来检查并修复mysql主从复制的数据差异; 后记:本文根据个人多年经验总结,个别建议可能有不完善之处,欢迎留言或者加我 微信公众号:MySQL中文网、QQ: 4700963 相互探讨交流。 写在最后:这次的优化参考,大部分情况下我都介绍了适用的场景,如果你的应用场景和本文描述的不太一样,那么建议根据实际情况进行调整,而不是生搬硬套。欢迎质疑拍砖,但拒绝不经过大脑的习惯性抵制。 附录:延伸阅读 1 、常用PC服务器阵列卡、硬盘健康监控 2 、PC服务器阵列卡管理简易手册 3 、实测Raid5 VS Raid1 + 0 下的innodb性能 4 、SAS vs SSD各种模式下MySQL TPCC OLTP对比测试结果 5 、MySQL出了门,Percona在左,MariaDB在右 6 、Percona Thread Pool性能基准测试 7 、[MySQL优化案例]系列 — 分页优化 8 、[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键 9 、[MySQL FAQ]系列 — 为什么要关闭query cache,如何关闭 |
http://imysql.com/2015/03/27/mysql-faq-why-should-we-disable-query-cache.shtml
时来天地皆同力,运去英雄不自由
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!