MySQL 调优/优化的 101 个建议!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原文:http://www.monitis.com/blog/101-tips-to-mysql-tuning-and-optimization/MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装环境,但是思路是相通的。我已经将它们分成了几类以帮助你理解。

原文:http://www.monitis.com/blog/101-tips-to-mysql-tuning-and-optimization/


MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装环境,但是思路是相通的。我已经将它们分成了几类以帮助你理解。



Mysql 监控


MySQL服务器硬件和OS(操作系统)调优:


1、有足够的物理内存,能将整个InnoDB文件加载到内存里 —— 如果访问的文件在内存里,而不是在磁盘上,InnoDB会快很多。


2、全力避免 Swap 操作 — 交换(swapping)是从磁盘读取数据,所以会很慢。


3、使用电池供电的RAM(Battery-Backed RAM)。


4、使用一个高级磁盘阵列 — 最好是 RAID10 或者更高。


5、避免使用RAID5 — 和校验需要确保完整性,开销很高。


6、将你的操作系统和数据分开,不仅仅是逻辑上要分开,物理上也要分开 — 操作系统的读写开销会影响数据库的性能。


7、将临时文件和复制日志与数据文件分开 — 后台的写操作影响数据库从磁盘文件的读写操作。


8、更多的磁盘空间等于更高的速度。


9、磁盘速度越快越好。


10、SAS优于SATA。


11、小磁盘的速度比大磁盘的更快,尤其是在 RAID 中。


12、使用电池供电的缓存 RAID(Battery-Backed Cache RAID)控制器。


13、避免使用软磁盘阵列。


14. 考虑使用固态IO卡(不是磁盘)来作为数据分区 — 几乎对所有量级数据,这种卡能够支持 2 GBps 的写操作。


15、在 Linux 系统上,设置 swappiness 的值为0 — 没有理由在数据库服务器上缓存文件,这种方式在Web服务器或桌面应用中用的更多。


16、尽可能使用 noatime 和 nodirtime 来挂载文件系统 — 没有必要为每次访问来更新文件的修改时间。


17、使用 XFS 文件系统 — 一个比ext3更快的、更小的文件系统,拥有更多的日志选项,同时,MySQL在ext3上存在双缓冲区的问题。


18、优化你的 XFS 文件系统日志和缓冲区参数 – -为了获取最大的性能基准。


19、在Linux系统中,使用 NOOP 或 DEADLINE IO 调度器 — CFQ 和 ANTICIPATORY 调度器已经被证明比 NOOP 和 DEADLINE 慢。


20、使用 64 位操作系统 — 有更多的内存能用于寻址和 MySQL 使用。


21、将不用的包和后台程序从服务器上删除 — 减少资源占用。


22、将使用 MySQL 的 host 和 MySQL自身的 host 都配置在一个 host 文件中 — 这样没有 DNS 查找。


23、永远不要强制杀死一个MySQL进程 — 你将损坏数据库,并运行备份。


24、让你的服务器只服务于MySQL — 后台处理程序和其他服务会占用数据库的 CPU 时间。



Mysql 配置


25、使用 innodb_flush_method=O_DIRECT 来避免写的时候出现双缓冲区。


26、避免使用 O_DIRECT 和 EXT3 文件系统 — 这会把所有写入的东西序列化。


27、分配足够 innodb_buffer_pool_size ,来将整个InnoDB 文件加载到内存 — 减少从磁盘上读。


28、不要让 innodb_log_file_size 太大,这样能够更快,也有更多的磁盘空间 — 经常刷新有利降低发生故障时的恢复时间。


29、不要同时使用 innodb_thread_concurrency 和 thread_concurrency 变量 — 这两个值不能兼容。


30、为 max_connections 指定一个小的值 — 太多的连接将耗尽你的RAM,导致整个MySQL服务器被锁定。


31、保持 thread_cache 在一个相对较高的数值,大约是 16 — 防止打开连接时候速度下降。


32、使用 skip-name-resolve — 移除 DNS 查找。


33、如果你的查询重复率比较高,并且你的数据不是经常改变,请使用查询缓存 — 但是,在经常改变的数据上使用查询缓存会对性能有负面影响。


34、增加 temp_table_size — 防止磁盘写。


35、增加 max_heap_table_size — 防止磁盘写。


36、不要将 sort_buffer_size 的值设置的太高 — 可能导致连接很快耗尽所有内存。


37、监控 key_read_requests 和 key_reads,以便确定 key_buffer 的值 — key 的读需求应该比 key_reads 的值更高,否则使用 key_buffer 就没有效率了。


38、设置 innodb_flush_log_at_trx_commit = 0 可以提高性能,但是保持默认值(1)的话,能保证数据的完整性,也能保证复制不会滞后。


39、有一个测试环境,便于测试你的配置,可以经常重启,不会影响生产环境。



Mysql Schema优化


40、保证你的数据库的整洁性。


41、归档老数据 — 删除查询中检索或返回的多余的行


42、在数据上加上索引。


43、不要过度使用索引,评估你的查询。


44、压缩 text 和 blob 数据类型 — 为了节省空间,减少从磁盘读数据。


45、UTF 8 和 UTF16 比 latin1 慢。


46、有节制的使用触发器。


47、保持数据最小量的冗余 — 不要复制没必要的数据.


48、使用链接表,而不是扩展行。


49、注意你的数据类型,尽可能的使用最小的。


50、如果其他数据需要经常需要查询,而 blob/text 不需要,则将 blob/text 数据域其他数据分离。


51、经常检查和优化表。


52、经常做重写 InnoDB 表的优化。


53、有时,增加列时,先删除索引,之后在加上索引会更快。


54、为不同的需求选择不同的存储引擎。


55、日志表或审计表使用ARCHIVE存储引擎 — 写的效率更高。


56、将 session 数据存储在 memcache 中,而不是 MySQL 中 — memcache 可以设置自动过期,防止MySQL对临时数据高成本的读写操作。


57、如果字符串的长度是可变的,则使用VARCHAR代替CHAR — 节约空间,因为CHAR是固定长度,而VARCHAR不是(utf8 不受这个影响)。


58、逐步对 schema 做修改 — 一个小的变化将产生的巨大的影响。


59、在开发环境测试所有 schema 变动,而不是在生产环境的镜像上去做。


60、不要随意改变你的配置文件,这可能产生非常大的影响。


61、有时候,少量的配置会更好。


62、质疑使用通用的MySQL配置文件。




Mysql 查询优化


63、使用慢查询日志,找出执行慢的查询。


64、使用 EXPLAIN 来决定查询功能是否合适。


65、经常测试你的查询,看是否需要做性能优化 — 性能可能会随着时间的变化而变化。


66、避免在整个表上使用count(*) ,它可能会将整个表锁住。


67、保持查询一致,这样后续类似的查询就能使用查询缓存了。


68、如果合适,用 GROUP BY 代替 DISTINCT。


69、在 WHERE、GROUP BY 和 ORDER BY 的列上加上索引。


70、保证索引简单,不要在同一列上加多个索引。


71、有时,MySQL 会选择错误的索引,这种情况使用 USE INDEX。


72、使用 SQL_MODE=STRICT 来检查问题。


73、索引字段少于5个时,UNION 操作用 LIMIT,而不是 OR。


74、使用 INSERT ON DUPLICATE KEY 或 INSERT IGNORE 来代替 UPDATE,避免 UPDATE 前需要先 SELECT。


75、使用索引字段和 ORDER BY 来代替 MAX。


76、避免使用 ORDER BY RAND()。


77、LIMIT M,N 在特定场景下会降低查询效率,有节制使用。


78、使用 UNION 来代替 WHERE 子句中的子查询。


79、对 UPDATE 来说,使用 SHARE MODE 来防止排他锁。


80、重启 MySQL 时,记得预热数据库,确保将数据加载到内存,提高查询效率。


81、使用 DROP TABLE ,然后再 CREATE TABLE ,而不是 DELETE FROM ,以删除表中所有数据。


82、最小化你要查询的数据,只获取你需要的数据,通常来说不要使用 *。


83、考虑持久连接,而不是多次建立连接,已减少资源的消耗。


84、基准查询,包括服务器的负载,有时一个简单的查询会影响其他的查询。


85、当服务器的负载增加时,使用SHOW PROCESSLIST来查看慢的/有问题的查询。


86、在存有生产环境数据副本的开发环境中,测试所有可疑的查询。



Mysql 备份过程


87、在二级复制服务器上进行备份。


88、备份过程中停止数据的复制,以防止出现数据依赖和外键约束的不一致。


89、彻底停止MySQL之后,再从数据文件进行备份。


90、如果使用MySQL dump进行备份,请同时备份二进制日志 — 确保复制过程不被中断。


91、不要信任 LVM 快照的备份 — 可能会创建不一致的数据,将来会因此产生问题。


92、为每个表做一个备份,这样更容易实现单表的恢复 — 如果数据与其他表是相互独立的。


93、使用 mysqldump 时,指定 -opt 参数。


94、备份前检测和优化表。


95、临时禁用外键约束,来提高导入的速度。


96、临时禁用唯一性检查,来提高导入的速度。


97、每次备份完后,计算数据库/表数据和索引的大小,监控其增长。


98、使用定时任务(cron)脚本,来监控从库复制的错误和延迟。


99、定期备份数据。


100、定期测试备份的数据。


101、执行MySQL 监控: Monitis Unveils The World’s First Free On-demand MySQL Monitoring。



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
171 0
|
2月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
118 6
|
3月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
3月前
|
存储 SQL 关系型数据库
MySQL 动态分区管理:自动化与优化实践
本文介绍了如何利用 MySQL 的存储过程与事件调度器实现动态分区管理,自动化应对数据增长,提升查询性能与数据管理效率,并详细解析了分区创建、冲突避免及实际应用中的关键注意事项。
141 0
|
5月前
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
6月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
6月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
7月前
|
存储 关系型数据库 MySQL
MySQL细节优化:关闭大小写敏感功能的方法。
通过这种方法,你就可以成功关闭 MySQL 的大小写敏感功能,让你的数据库操作更加便捷。
550 19
|
7月前
|
SQL 负载均衡 关系型数据库
MySQL复制以及调优
本文介绍了MySQL自带复制方案的实现及其注意事项。复制方案能提供数据备份、负载均衡与分布式数据管理的优势。文章详细描述了复制步骤:主库(master)记录更改到二进制日志,发送同步消息给从库(slave),从库接收后将日志复制到本地并执行。实现复制包括配置主库的server-id和二进制日志、创建复制账号、初始化主库数据、设置从库参数及开启复制。此外,还探讨了三种日志格式(row、statement、mixed)的特点及选择建议,并分析了主从复制延迟的优化方法,如控制事务大小、优化日志传输和多线程还原日志等。最后,文中列出了搭建过程中需要注意的关键点。
136 3
|
8月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
320 9

推荐镜像

更多