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

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

 

Mysql 监控sql

MySQL服务器硬件和OS(操做系统)调优:数据库

一、有足够的物理内存,能将整个InnoDB文件加载到内存里 —— 若是访问的文件在内存里,而不是在磁盘上,InnoDB会快不少。缓存

二、全力避免 Swap 操做 — 交换(swapping)是从磁盘读取数据,因此会很慢。性能优化

三、使用电池供电的RAM(Battery-Backed RAM)。服务器

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

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

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

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

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

九、磁盘速度越快越好。

十、SAS优于SATA。

十一、小磁盘的速度比大磁盘的更快,尤为是在 RAID 中。

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

1三、避免使用软磁盘阵列。

14. 考虑使用固态IO卡(不是磁盘)来做为数据分区 — 几乎对全部量级数据,这种卡可以支持 2 GBps 的写操做。

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

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

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

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

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

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

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

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

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

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

Mysql 配置

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

2六、避免使用 O_DIRECT 和 EXT3 文件系统 — 这会把全部写入的东西序列化。

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

2八、不要让 innodb_log_file_size 太大,这样可以更快,也有更多的磁盘空间 — 常常刷新有利下降发生故障时的恢复时间。

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

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

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

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

3三、若是你的查询重复率比较高,而且你的数据不是常常改变,请使用查询缓存 — 可是,在常常改变的数据上使用查询缓存会对性能有负面影响。

3四、增长 temp_table_size — 防止磁盘写。

3五、增长 max_heap_table_size — 防止磁盘写。

3六、不要将 sort_buffer_size 的值设置的过高 — 可能致使链接很快耗尽全部内存。

3七、监控 key_read_requests 和 key_reads,以便肯定 key_buffer 的值 — key 的读需求应该比 key_reads 的值更高,不然使用 key_buffer 就没有效率了。

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

3九、有一个测试环境,便于测试你的配置,能够常常重启,不会影响生产环境。

Mysql Schema优化

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

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

4二、在数据上加上索引。

4三、不要过分使用索引,评估你的查询。

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

4五、UTF 8 和 UTF16 比 latin1 慢。

4六、有节制的使用触发器。

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

4八、使用连接表,而不是扩展行。

4九、注意你的数据类型,尽量的使用最小的。

50、若是其余数据须要常常须要查询,而 blob/text 不须要,则将 blob/text 数据域其余数据分离。

5一、常常检查和优化表。

5二、常常作重写 InnoDB 表的优化。

5三、有时,增长列时,先删除索引,以后在加上索引会更快。

5四、为不一样的需求选择不一样的存储引擎。

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

5六、将 session 数据存储在 memcache 中,而不是 MySQL 中 — memcache 能够设置自动过时,防止MySQL对临时数据高成本的读写操做。

5七、若是字符串的长度是可变的,则使用VARCHAR代替CHAR — 节约空间,由于CHAR是固定长度,而VARCHAR不是(utf8 不受这个影响)。

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

5九、在开发环境测试全部 schema 变更,而不是在生产环境的镜像上去作。

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

6一、有时候,少许的配置会更好。

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

Mysql 查询优化

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

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

6五、常常测试你的查询,看是否须要作性能优化 — 性能可能会随着时间的变化而变化。

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

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

6八、若是合适,用 GROUP BY 代替 DISTINCT。

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

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

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

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

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

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

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

7六、避免使用 ORDER BY RAND()。

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

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

7九、对 UPDATE 来讲,使用 SHARE MODE 来防止排他锁。

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

8一、使用 DROP TABLE ,而后再 CREATE TABLE ,而不是 DELETE FROM ,以删除表中全部数据。

8二、最小化你要查询的数据,只获取你须要的数据,一般来讲不要使用 *。

8三、考虑持久链接,而不是屡次创建链接,已减小资源的消耗。

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

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

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

Mysql 备份过程

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

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

8九、完全中止MySQL以后,再从数据文件进行备份。

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

9一、不要信任 LVM 快照的备份 — 可能会建立不一致的数据,未来会所以产生问题。

9二、为每一个表作一个备份,这样更容易实现单表的恢复 — 若是数据与其余表是相互独立的。

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

9四、备份前检测和优化表。

9五、临时禁用外键约束,来提升导入的速度。

9六、临时禁用惟一性检查,来提升导入的速度。

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

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

9九、按期备份数据。

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

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

做者:Java技术栈 连接:https://www.jianshu.com/p/482ade3dff58 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

相关文章
相关标签/搜索