`
dengkane
  • 浏览: 42433 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

比较全面的MySQL优化参考

阅读更多

本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。

 

1、硬件层相关优化

 

1.1、CPU相关

 

在服务器的BIOS设置中,可调整下面的几个配置,目的是发挥CPU最大性能,或者避免经典的NUMA问题:

 

1、选择Performance Per Watt Optimized(DAPC)模式,发挥CPU最大性能,跑DB这种通常需要高运算量的服务就不要考虑节电了;

 

2、关闭C1E和C States等选项,目的也是为了提升CPU效率;

 

3、Memory Frequency(内存频率)选择Maximum Performance(最佳性能);

 

4、内存设置菜单中,启用Node Interleaving,避免NUMA问题;

 

1.2、磁盘I/O相关

 

下面几个是按照IOPS性能提升的幅度排序,对于磁盘I/O可优化的一些措施:

 

1、使用SSD或者PCIe SSD设备,至少获得数百倍甚至万倍的IOPS提升;

 

2、购置阵列卡同时配备CACHE及BBU模块,可明显提升IOPS(主要是指机械盘,SSD或PCIe SSD除外。同时需要定期检查CACHE及BBU模块的健康状况,确保意外时不至于丢失数据);

 

3、有阵列卡时,设置阵列写策略为WB,甚至FORCE WB(若有双电保护,或对数据安全性要求不是特别高的话),严禁使用WT策略。并且闭阵列预读策略,基本上是鸡肋,用处不大;

 

4、尽可能选用RAID-10,而非RAID-5;

 

5、使用机械盘的话,尽可能选择高转速的,例如选用15KRPM,而不是7.2KRPM的盘,不差几个钱的;

 

2、系统层相关优化

 

2.1、文件系统层优化

 

在文件系统层,下面几个措施可明显提升IOPS性能:

 

1、使用deadline/noop这两种I/O调度器,千万别用cfq(它不适合跑DB类服务);

 

2、使用xfs文件系统,千万别用ext3;ext4勉强可用,但业务量很大的话,则一定要用xfs;

 

3、文件系统mount参数中增加:noatime, nodiratime, nobarrier几个选项(nobarrier是xfs文件系统特有的);

 

2.2、其他内核参数优化

 

针对关键内核参数设定合适的值,目的是为了减少swap的倾向,并且让内存和磁盘I/O不会出现大幅波动,导致瞬间波峰负载:

 

1、将vm.swappiness设置为5-10左右即可,甚至设置为0(RHEL 7以上则慎重设置为0,除非你允许OOM kill发生),以降低使用SWAP的机会;

 

2、将vm.dirty_background_ratio设置为5-10,将vm.dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待(和MySQL中的innodb_max_dirty_pages_pct类似);

 

3、将net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都设置为1,减少TIME_WAIT,提高TCP效率;

 

4、至于网传的read_ahead_kb、nr_requests这两个参数,我经过测试后,发现对读写混合为主的OLTP环境影响并不大(应该是对读敏感的场景更有效果),不过没准是我测试方法有问题,可自行斟酌是否调整;

 

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 相互探讨交流。

 

写在最后:这次的优化参考,大部分情况下我都介绍了适用的场景,如果你的应用场景和本文描述的不太一样,那么建议根据实际情况进行调整,而不是生搬硬套。欢迎质疑拍砖,但拒绝不经过大脑的习惯性抵制。

 

[转载自:http://imysql.com/2015/05/24/mysql-optimization-reference-1.shtml]

分享到:
评论

相关推荐

    比较全面的MySQL优化参考.pdf

    综上所述,MySQL优化是一个全面考虑硬件配置、系统参数、数据库参数和数据设计等多方面因素的系统性工程。通过细致的分析和调整,可以大大提高MySQL数据库的性能,从而为企业提供更为稳定和高效的数据库服务。

    MySQL8.0参考手册.pdf

    MySQL 8.0 参考手册是 MySQL 官方提供的一份详细的参考手册,该手册涵盖了 MySQL 8.0 版本的所有方面,包括概述、安装、配置、管理、安全、性能优化、故障排除等等。下面是该手册中的一些重要知识点: 1. MySQL ...

    MySQL中文参考手册CHM版

    MySQL中文参考手册CHM版包含了丰富的关于MySQL数据库的知识,它是一个强大的开源关系型数据库管理系统,广泛应用于各种规模的企业和项目中。手册详细介绍了MySQL的安装、配置、使用以及管理等各个方面,是学习和工作...

    MySql 5.1 参考手册.chm

    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. ...

    MySQL中文参考手册

    MySQL中文参考手册是一份详尽的数据库管理系统指南,专为使用MySQL进行数据存储、管理和查询的用户和开发者设计。MySQL是一种流行的开源关系型数据库管理系统的(RDBMS),它以其高效、稳定和易于扩展的特性而受到全球...

    MySQL 8.0 参考手册教程pdf

    MySQL 8.0 是当前广泛使用的开源关系型数据库管理系统,其参考手册教程为用户提供了一步一步的学习路径,帮助用户从零开始掌握MySQL的基本操作。在本教程中,我们将深入探讨几个关键知识点,包括如何使用mysql客户端...

    mysql优化笔记参考

    ### MySQL优化知识点详解 在日常的数据库管理与维护过程中,MySQL优化是一项至关重要的工作,它不仅能够提升数据库的性能,还能提高数据处理的效率。本文将根据提供的标题、描述及部分内容,深入探讨MySQL优化的...

    MYSQL.rar_MYSQL_mysql 优化_mysql优化_mysql备份_sql优化

    综上所述,“MYSQL.rar”提供的资源涵盖了MySQL优化的多个方面,对于数据库管理员来说是非常宝贵的参考资料。通过对MySQL的深度优化,不仅可以提升系统的响应速度,还能确保数据的安全性和可用性。通过学习和实践,...

    Mysql参考手册5.7中文版pdf

    MySQL参考手册5.7中文版是数据库管理员、开发人员和IT专业人员不可或缺的资源,它提供了关于MySQL 5.7版本的详尽信息。...通过深入阅读和实践,可以更全面地掌握MySQL 5.7的各种特性和使用技巧,提升数据库管理技能。

    mysql8中英双语参考手册.rar

    本参考资料针对的是MySQL 8.0的中英双语版本,旨在为用户提供全面、直观的学习和查询资源。 首先,`mysql8中文参考手册.chm`是一个中文帮助文档,适合初学者和对中文较为熟悉的用户。CHM文件是一种Windows平台下的...

    MySQL 中文参考手册

    总的来说,"MySQL中文参考手册"是一套全面的学习资源,无论你是初学者还是经验丰富的数据库管理员,都能从中获益。通过深入学习并实践其中的知识,你将能够更好地驾驭MySQL,实现高效的数据存储和管理。

    MySQL中文参考手册.chm

    MySQL中文参考手册.chm 449kb <br/>0 译者序 1 MySQL的一般的信息 1.1 什么是MySQL? 1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5...

    MySQL 5.1参考手册

    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT ...

    MySQL 基础教程参考手册

    叶金荣:MySQL优化__系统架构师大会.pdf MySQL 中文参考手册.pdf MySQL 官方简体中文版参考手册.pdf MySQL服务器参数优化指南.pdf MySQL存储过程基础教程.pdf MySql 手册.pdf MySQL_中文参考手册.pdf Mysql双机热备...

    mysql配置参数详解(优化参考).docx

    虽然排版不好看,但是 都是硬货 ,记录了绝大部分的mysql 优化参数 以及作用案例,建议资深程序员必看

    MySQL性能优化和高可用架构实践.pptx

    "MySQL性能优化和高可用架构实践" 本书《MySQL性能优化和高可用架构实践》是一本详细介绍MySQL性能优化和高可用架构实践的书籍,旨在帮助读者提升MySQL数据库的性能和可靠性。本书的内容涵盖了查询优化的基本原则和...

    mysql性能优化综述

    ### MySQL性能优化综述 MySQL作为一款广泛使用的开源关系型数据库管理系统,在许多应用场景中都需要针对其性能进行优化。本文将从几个关键方面详细介绍如何优化MySQL的性能。 #### 1. 最底层优化 - **参数优化**:...

    MYSQL语法参考手册参考大全

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。本参考大全将深入探讨MySQL的SQL语法,帮助用户更好地理解和运用...本参考大全旨在提供全面的指南,帮助读者深入了解并应用MySQL。

Global site tag (gtag.js) - Google Analytics