全文内容预览:
那性能优化就应该一把梭子吗?还是要符合一些规范和原则呢?
所以,在开始之前(MySQL 优化),咱们先来聊聊性能优化的一些原则。
性能优化一般可以分为:
所谓的主动优化是指不需要外力的推动而自发进行的一种行为,比如当服务没有明显的卡顿、宕机或者硬件指标异常的情况下,自我出发去优化的行为,就可以称之为主动优化。
而被动优化刚好与主动优化相反,它是指在发现了服务器卡顿、服务异常或者物理指标异常的情况下,才去优化的这种行为。
性能优化原则
无论是主动优化还是被动优化都要符合以下性能优化的原则:
以上原则看似都是些废话,但却给了我们一个启发,那就是我们性能优化手段应该是:预防性能问题为主+被动优化为辅。
也就是说,我们应该以预防性能问题为主,在开发阶段尽可能的规避性能问题,而在正常情况下,应尽量避免主动优化,以防止未知的风险(除非是为了 KPI,或者是闲的没事),尤其对生产环境而言更是如此,最后才是考虑被动优化。
PS:当遇到性能缓慢下降、或硬件指标缓慢增加的情况,如今天内存的占用率是 50%,明天是 70%,后天是 90% ,并且丝毫没有收回的迹象时,我们应该提早发现并处理此类问题(这种情况也属于被动优化的一种)。
所以我们本文会重点介绍 MySQL 被动性能优化的知识,根据被动性能优化的知识,你就可以得到预防性能问题发生的一些方法,从而规避 MySQL 的性能问题。
本文我们会从问题入手,然后考虑这个问题产生的原因以及相应的优化方案。我们在实际开发中,通常会遇到以下 3 个问题:
造成单条 SQL 运行比较慢的常见原因有以下两个:
索引是一种能帮助 MySQL 提高查询效率的主要手段,因此一般情况下我们遇到的单条 SQL 性能问题,通常都是由于未创建或未正确使用索引而导致的,所以在遇到单条 SQL 运行比较慢的情况下,你首先要做的就是检查此表的索引是否正常创建。
如果表的索引已经创建了,接下来就要检查一下此 SQL 语句是否正常触发了索引查询,如果发生以下情况那么 MySQL 将不能正常的使用索引:
因此你要尽量避免以上情况,除了正常使用索引之外,我们也可以使用以下技巧来优化索引的查询速度:
回表查询:普通索引查询到主键索引后,回到主键索引树搜索的过程,我们称为回表查询。
当表中数据量太大时 SQL 的查询会比较慢,你可以考虑拆分表,让每张表的数据量变小,从而提高查询效率。
指的是将表进行拆分,把一张列比较多的表拆分为多张表。比如,用户表中一些字段经常被访问,将这些字段放在一张表中,另外一些不常用的字段放在另一张表中,插入数据时,使用事务确保两张表的数据一致性。垂直拆分的原则:
指的是将数据表行进行拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。通常情况下,我们使用取模的方式来进行表的拆分,比如,一张有 400W 的用户表 users,为提高其查询效率我们把其分成 4 张表 users1,users2,users3,users4,然后通过用户 ID 取模的方法,同时查询、更新、删除也是通过取模的方法来操作。
部分 SQL 运行比较慢,我们首先要做的就是先定位出这些 SQL,然后再看这些 SQL 是否正确创建并使用索引。也就是说,我们先要使用慢查询工具定位出具体的 SQL,然后再使用问题 1 的解决方案处理慢 SQL。
MySQL 中自带了慢查询日志的功能,开启它就可以用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过 long_query_time 值的 SQL,则会被记录到慢查询日志中。long_query_time 的默认值为 10,意思是运行 10S 以上的语句。默认情况下,MySQL 数据库并不启动慢查询日志,需要我们手动来设置这个参数,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会给 MySQL 服务器带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。使用 mysql> show variables like '%slow_query_log%'; 来查询慢查询日志是否开启,执行效果如下图所示:
slow_query_log 的值为 OFF 时,表示未开启慢查询日志。
开启慢查询日志,可以使用如下 MySQL 命令:
mysql> set global slow_query_log=1
不过这种设置方式,只对当前数据库生效,如果 MySQL 重启也会失效,如果要永久生效,就必须修改 MySQL 的配置文件 my.cnf,配置如下:
slow_query_log =1 slow_query_log_file=/tmp/mysql_slow.log
当你开启慢查询日志之后,所有的慢查询 SQL 都会被记录在 slow_query_log_file 参数配置的文件内,默认是 /tmp/mysql_slow.log 文件,此时我们就可以打开日志查询到所有慢 SQL 进行逐个优化。
当出现整个 SQL 都运行比较慢就说明目前数据库的承载能力已经到了峰值,因此我们需要使用一些数据库的扩展手段来缓解 MySQL 服务器了。
一般情况下对数据库而言都是“读多写少”,换言之,数据库的压力多数是因为大量的读取数据的操作造成的,我们可以采用数据库集群的方案,使用一个库作为主库,负责写入数据;其他库为从库,负责读取数据。这样可以缓解对数据库的访问压力。
MySQL 常见的读写分离方案有以下两种:
可以通过应用层对数据源做路由来实现读写分离,比如,使用 SpringMVC + MyBatis,可以将 SQL 路由交给 Spring,通过 AOP 或者 Annotation 由代码显示的控制数据源。优点:路由策略的扩展性和可控性较强。缺点:需要在 Spring 中添加耦合控制代码。
通过 MySQL 的中间件做主从集群,比如:Mysql Proxy、Amoeba、Atlas 等中间件都能符合需求。优点:与应用层解耦。缺点:增加一个服务维护的风险点,性能及稳定性待测试,需要支持代码强制主从和事务。
在 MySQL 中我们可以使用 explain 命令来分析 SQL 的执行情况,比如:
explain select * from t where id=5;
如下图所示:
其中:
其中最重要的就是 type 字段,type 值类型如下:
本文我们介绍了 MySQL 性能优化的原则和分类,MySQL 的性能优化可分为:主动优化和被动优化,但无论何种优化都要保证服务的正确性、安全性和稳定性。它带给我们的启发是应该采用:预防 + 被动优化的方案来确保 MySQL 服务器的稳定性,而被动优化常见的问题是:
因此我们给出了每种被动优化方案的问题分析和解决方案,希望本文可以帮助到你。
最后的话原创不易,都看到这了,点个「赞」再走呗,这是对我最大的支持与鼓励,谢谢你!
以下文章来源于Java中文社群 ,作者磊哥
下面给大家分享一份文档《mysql8从入门到精通》教学版!需要获取的小伙伴可以直接转发+关注后私信(666)或(111)即可获取!
本文档主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL日志、性能优化、MySQLReplication、MySQL Workbench、MySQL Utilities、MySQL. Proxy,PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进一步讲述MySQL在实际工作中的应用。
本文档共有480个实例和16个综合案例,还有大量的经典习题。随书赠送了近20小时培训班形式的视频教学录像,详细讲解了书中每一个知识点和每一个数据库操作的方法和技巧,同时还提供了本书所有例子的源代码,读者可以直接查看和调用。
本文档注重实战操作,帮助读者循序渐进地掌握MySQL中的各项技术,非常适合MySQL数据库初学者、MySQL数据库开发人员和MySQL数据库管理员阅读,同时也能作为高等院校和培训学校相关专业师生的教学用书。
第1章主要介绍数据库的技术构成和什么是MySQL,包括数据库基本概念和MySQL工具。
第2章介绍MySQL8的安装和配置,主要包括Windows平台下的安装和配置、Linux平台下的安装和配置、如何启动MySQL服务、如何更改MySQL的配置等。
第3章介绍MySQL数据库的基本操作,包括创建数据库、删除数据库和MySQL数据库存储引擎。
第4章介绍MySQL数据表的基本操作,主要包括创建数据表、查看数据表结构、修改数据表和删除数据表。
第5章介绍MySQL中的数据类型和运算符,主要包括MySQL数据类型介绍、如何选择数据类型和常见运算符介绍。
第6章介绍MySQL函数,包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数和其他函数。
第7章介绍如何查询数据表中的数据,主要包括基本查询语句、单表查询、使用聚合函数查询、连接查询、子查询、合并查询结果、为表和字段取别名以及使用正则表达式查询。
第8章介绍如何插入、更新与删除数据,包括插入数据、更新数据、删除数据。
第9章介绍MySQL中的索引,包括索引简介、如何创建各种类型的索引和如何删除索引。
第10章介绍MySQL 中的存储过程和函数,包括存储过程和函数的创建、调用、查看、修改和删除。
第11章介绍MySQL视图,主要介绍视图的概念、创建视图、查看视图、修改视图、更新视图和删除视图。
第12章介绍MySQL触发器,包括创建触发器、查看触发器、触发器的使用和删除触发器。
第13章介绍MySQL用户管理,主要包括MySQL 中的各种权限表、账户管理、权限管理和MySQL的访问控制机制。
第14章介绍MySQL数据库的备份和恢复,主要包括数据备份、数据恢复、数据库的迁移和数据表的导出和导入。
第15章介绍MySQL日志,主要包括日志简介、二进制日志、错误日志、通用查询日志和慢查询日志。
第16章介绍如何对MySQL进行性能优化,包括优化简介、优化查询、优化数据库结构和优化MySQL服务器。
第17章介绍MySQL Replication复制数据的操作方法和技巧。
第18章介绍MySQL Workbench设计MySQL 数据库的方法和技巧。
第19章介绍MySQL Utilities管理 MySQL数据库的方法和技巧。
第20章介绍MySQL Proxy 操作MySQL 数据库的方法和技巧。
第21章介绍PHP操作MySQL 数据库的方法和技巧。
第22章介绍 MySQL存储引擎的工作原理。
第23章介绍 PHP操作MySQL 数据库的方法和技巧。
第24章介绍 PDO数据库抽象类库的使用方法和技巧。
第25章介绍开发网上商场的方法和实现过程。
第26章介绍论坛系统数据库的设计方法和实现过程。
下面给大家分享一份文档《mysql8从入门到精通》教学版!需要获取的小伙伴可以直接转发+关注后私信(666)或(111)即可获取!
下面给大家分享一份文档《mysql8从入门到精通》教学版!需要获取的小伙伴可以直接转发+关注后私信(666)或(111)即可获取!