看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

年少不知优化苦,遇坑方知优化难。——村口王大爷

全文内容预览:

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

那性能优化就应该一把梭子吗?还是要符合一些规范和原则呢?

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

所以,在开始之前(MySQL 优化),咱们先来聊聊性能优化的一些原则。

性能优化原则和分类

性能优化一般可以分为:

  • 主动优化
  • 被动优化

所谓的主动优化是指不需要外力的推动而自发进行的一种行为,比如当服务没有明显的卡顿、宕机或者硬件指标异常的情况下,自我出发去优化的行为,就可以称之为主动优化。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

而被动优化刚好与主动优化相反,它是指在发现了服务器卡顿、服务异常或者物理指标异常的情况下,才去优化的这种行为。

性能优化原则

无论是主动优化还是被动优化都要符合以下性能优化的原则:

  1. 优化不能改变服务运行的逻辑,要保证服务的正确性
  2. 优化的过程和结果都要保证服务的安全性
  3. 要保证服务的稳定性,不能为了追求性能牺牲程序的稳定性。比如不能为了提高 Redis 的运行速度,而关闭持久化的功能,因为这样在 Redis 服务器重启或者掉电之后会丢失存储的数据。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

以上原则看似都是些废话,但却给了我们一个启发,那就是我们性能优化手段应该是:预防性能问题为主+被动优化为辅

也就是说,我们应该以预防性能问题为主,在开发阶段尽可能的规避性能问题,而在正常情况下,应尽量避免主动优化,以防止未知的风险(除非是为了 KPI,或者是闲的没事),尤其对生产环境而言更是如此,最后才是考虑被动优化

PS:当遇到性能缓慢下降、或硬件指标缓慢增加的情况,如今天内存的占用率是 50%,明天是 70%,后天是 90% ,并且丝毫没有收回的迹象时,我们应该提早发现并处理此类问题(这种情况也属于被动优化的一种)。

MySQL 被动性能优化

所以我们本文会重点介绍 MySQL 被动性能优化的知识,根据被动性能优化的知识,你就可以得到预防性能问题发生的一些方法,从而规避 MySQL 的性能问题

本文我们会从问题入手,然后考虑这个问题产生的原因以及相应的优化方案。我们在实际开发中,通常会遇到以下 3 个问题:

  1. 单条 SQL 运行慢;
  2. 部分 SQL 运行慢;
  3. 整个 SQL 运行慢。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势


问题 1:单条 SQL 运行慢

问题分析

造成单条 SQL 运行比较慢的常见原因有以下两个:

  1. 未正常创建或使用索引;
  2. 表中数据量太大。

解决方案 1:创建并正确使用索引

索引是一种能帮助 MySQL 提高查询效率的主要手段,因此一般情况下我们遇到的单条 SQL 性能问题,通常都是由于未创建或未正确使用索引而导致的,所以在遇到单条 SQL 运行比较慢的情况下,你首先要做的就是检查此表的索引是否正常创建

如果表的索引已经创建了,接下来就要检查一下此 SQL 语句是否正常触发了索引查询,如果发生以下情况那么 MySQL 将不能正常的使用索引:

  1. 在 where 子句中使用 != 或者 <> 操作符,查询引用会放弃索引而进行全表扫描;
  2. 不能使用前导模糊查询,也就是 '%XX' 或 '%XX%',由于前导模糊不能利用索引的顺序,必须一个个去找,看是否满足条件,这样会导致全索引扫描或者全表扫描;
  3. 如果条件中有 or 即使其中有条件带索引也不会正常使用索引,要想使用 or 又想让索引生效,只能将 or 条件中的每个列都加上索引才能正常使用;
  4. 在 where 子句中对字段进行表达式操作。

因此你要尽量避免以上情况,除了正常使用索引之外,我们也可以使用以下技巧来优化索引的查询速度

  1. 尽量使用主键查询,而非其他索引,因为主键查询不会触发回表查询;
  2. 查询语句尽可能简单,大语句拆小语句,减少锁时间;
  3. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型;
  4. 用 exists 替代 in 查询;
  5. 避免在索引列上使用 is null 和 is not null。

回表查询:普通索引查询到主键索引后,回到主键索引树搜索的过程,我们称为回表查询。

解决方案 2:数据拆分

当表中数据量太大时 SQL 的查询会比较慢,你可以考虑拆分表,让每张表的数据量变小,从而提高查询效率。

1.垂直拆分

指的是将表进行拆分,把一张列比较多的表拆分为多张表。比如,用户表中一些字段经常被访问,将这些字段放在一张表中,另外一些不常用的字段放在另一张表中,插入数据时,使用事务确保两张表的数据一致性。垂直拆分的原则:

  • 把不常用的字段单独放在一张表;
  • 把 text,blob 等大字段拆分出来放在附表中;
  • 经常组合查询的列放在一张表中。

2.水平拆分

指的是将数据表行进行拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。通常情况下,我们使用取模的方式来进行表的拆分,比如,一张有 400W 的用户表 users,为提高其查询效率我们把其分成 4 张表 users1,users2,users3,users4,然后通过用户 ID 取模的方法,同时查询、更新、删除也是通过取模的方法来操作。

表的其他优化方案:

  1. 使用可以存下数据最小的数据类型;
  2. 使用简单的数据类型,int 要比 varchar 类型在 MySQL 处理简单;
  3. 尽量使用 tinyint、smallint、mediumint 作为整数类型而非 int;
  4. 尽可能使用 not null 定义字段,因为 null 占用 4 字节空间;
  5. 尽量少用 text 类型,非用不可时最好考虑分表;
  6. 尽量使用 timestamp,而非 datetime;
  7. 单表不要有太多字段,建议在 20 个字段以内。

问题 2:部分 SQL 运行慢

问题分析

部分 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%'; 来查询慢查询日志是否开启,执行效果如下图所示:

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

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 进行逐个优化。

问题 3:整个 SQL 运行慢

问题分析

当出现整个 SQL 都运行比较慢就说明目前数据库的承载能力已经到了峰值,因此我们需要使用一些数据库的扩展手段来缓解 MySQL 服务器了。

解决方案:读写分离

一般情况下对数据库而言都是“读多写少”,换言之,数据库的压力多数是因为大量的读取数据的操作造成的,我们可以采用数据库集群的方案,使用一个库作为主库,负责写入数据;其他库为从库,负责读取数据。这样可以缓解对数据库的访问压力。

MySQL 常见的读写分离方案有以下两种:

1.应用层解决方案

可以通过应用层对数据源做路由来实现读写分离,比如,使用 SpringMVC + MyBatis,可以将 SQL 路由交给 Spring,通过 AOP 或者 Annotation 由代码显示的控制数据源。优点:路由策略的扩展性和可控性较强。缺点:需要在 Spring 中添加耦合控制代码。

2.中间件解决方案

通过 MySQL 的中间件做主从集群,比如:Mysql Proxy、Amoeba、Atlas 等中间件都能符合需求。优点:与应用层解耦。缺点:增加一个服务维护的风险点,性能及稳定性待测试,需要支持代码强制主从和事务。

扩展知识:SQL 语句分析

在 MySQL 中我们可以使用 explain 命令来分析 SQL 的执行情况,比如:

explain select * from t where id=5;

如下图所示:

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

其中:

  • id — 选择标识符,id 越大优先级越高,越先被执行;
  • select_type — 表示查询的类型;
  • table — 输出结果集的表;
  • partitions — 匹配的分区;
  • type — 表示表的连接类型;
  • possible_keys — 表示查询时,可能使用的索引;
  • key — 表示实际使用的索引;
  • key_len — 索引字段的长度;
  • ref— 列与索引的比较;
  • rows — 大概估算的行数;
  • filtered — 按表条件过滤的行百分比;
  • Extra — 执行情况的描述和说明。

其中最重要的就是 type 字段,type 值类型如下:

  • all — 扫描全表数据;
  • index — 遍历索引;
  • range — 索引范围查找;
  • index_subquery — 在子查询中使用 ref;
  • unique_subquery — 在子查询中使用 eq_ref;
  • ref_or_null — 对 null 进行索引的优化的 ref;
  • fulltext — 使用全文索引;
  • ref — 使用非唯一索引查找数据;
  • eq_ref — 在 join 查询中使用主键或唯一索引关联;
  • const — 将一个主键放置到 where 后面作为条件查询, MySQL 优化器就能把这次查询优化转化为一个常量,如何转化以及何时转化,这个取决于优化器,这个比 eq_ref 效率高一点。

总结

本文我们介绍了 MySQL 性能优化的原则和分类,MySQL 的性能优化可分为:主动优化和被动优化,但无论何种优化都要保证服务的正确性、安全性和稳定性。它带给我们的启发是应该采用:预防 + 被动优化的方案来确保 MySQL 服务器的稳定性,而被动优化常见的问题是:

  • 单条 SQL 运行慢;
  • 部分 SQL 运行慢;
  • 整个 SQL 运行慢。

因此我们给出了每种被动优化方案的问题分析和解决方案,希望本文可以帮助到你。

  最后的话原创不易,都看到这了,点个「赞」再走呗,这是对我最大的支持与鼓励,谢谢你!
以下文章来源于Java中文社群 ,作者磊哥

下面给大家分享一份文档《mysql8从入门到精通》教学版!需要获取的小伙伴可以直接转发+关注后私信(666)或(111)即可获取!

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

本文档主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL日志、性能优化、MySQLReplication、MySQL Workbench、MySQL Utilities、MySQL. Proxy,PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进一步讲述MySQL在实际工作中的应用。

本文档共有480个实例和16个综合案例,还有大量的经典习题。随书赠送了近20小时培训班形式的视频教学录像,详细讲解了书中每一个知识点和每一个数据库操作的方法和技巧,同时还提供了本书所有例子的源代码,读者可以直接查看和调用。

本文档注重实战操作,帮助读者循序渐进地掌握MySQL中的各项技术,非常适合MySQL数据库初学者、MySQL数据库开发人员和MySQL数据库管理员阅读,同时也能作为高等院校和培训学校相关专业师生的教学用书。

章节内容:

第1章﹐初识 MySQL

第1章主要介绍数据库的技术构成和什么是MySQL,包括数据库基本概念和MySQL工具。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第2章MySQL的安装与配置

第2章介绍MySQL8的安装和配置,主要包括Windows平台下的安装和配置、Linux平台下的安装和配置、如何启动MySQL服务、如何更改MySQL的配置等。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第3章数据库的基本操作

第3章介绍MySQL数据库的基本操作,包括创建数据库、删除数据库和MySQL数据库存储引擎。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第4章数据表的基本操作

第4章介绍MySQL数据表的基本操作,主要包括创建数据表、查看数据表结构、修改数据表和删除数据表。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第5章数据类型和运算符,

第5章介绍MySQL中的数据类型和运算符,主要包括MySQL数据类型介绍、如何选择数据类型和常见运算符介绍。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第6章MySQL函数

第6章介绍MySQL函数,包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数和其他函数。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第7章查询数据

第7章介绍如何查询数据表中的数据,主要包括基本查询语句、单表查询、使用聚合函数查询、连接查询、子查询、合并查询结果、为表和字段取别名以及使用正则表达式查询。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第8章插入、更新与删除数据

第8章介绍如何插入、更新与删除数据,包括插入数据、更新数据、删除数据。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第九章索引

第9章介绍MySQL中的索引,包括索引简介、如何创建各种类型的索引和如何删除索引。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第10章存储过程和函数

第10章介绍MySQL 中的存储过程和函数,包括存储过程和函数的创建、调用、查看、修改和删除。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第11章视图

第11章介绍MySQL视图,主要介绍视图的概念、创建视图、查看视图、修改视图、更新视图和删除视图。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第12章MySQL触发器

第12章介绍MySQL触发器,包括创建触发器、查看触发器、触发器的使用和删除触发器。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第13章MySQL 权限与安全管理

第13章介绍MySQL用户管理,主要包括MySQL 中的各种权限表、账户管理、权限管理和MySQL的访问控制机制。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第14章数据备份与恢复

第14章介绍MySQL数据库的备份和恢复,主要包括数据备份、数据恢复、数据库的迁移和数据表的导出和导入。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第15章MySQL日志

第15章介绍MySQL日志,主要包括日志简介、二进制日志、错误日志、通用查询日志和慢查询日志。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第16章性能优化

第16章介绍如何对MySQL进行性能优化,包括优化简介、优化查询、优化数据库结构和优化MySQL服务器。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第17章MySQL Replication

第17章介绍MySQL Replication复制数据的操作方法和技巧。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第18章MySQL Workbench的使用

第18章介绍MySQL Workbench设计MySQL 数据库的方法和技巧。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第19章MySQL管理利器——MySQL Utilities

第19章介绍MySQL Utilities管理 MySQL数据库的方法和技巧。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第20章读写分离的利器-—MySQL Proxy

第20章介绍MySQL Proxy 操作MySQL 数据库的方法和技巧。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第21章﹐精通 MySQL存储引擎

第21章介绍PHP操作MySQL 数据库的方法和技巧。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第22章PHP操作MySQL 数据库

第22章介绍 MySQL存储引擎的工作原理。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第23章PDO数据库抽象类库

第23章介绍 PHP操作MySQL 数据库的方法和技巧。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第24章综合项目1———开发网上商城

第24章介绍 PDO数据库抽象类库的使用方法和技巧。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第25章综合项目2——论坛管理系统数据库设计

第25章介绍开发网上商场的方法和实现过程。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

第26章综合项目3———新闻发布系统数据库设计

第26章介绍论坛系统数据库的设计方法和实现过程。

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

下面给大家分享一份文档《mysql8从入门到精通》教学版!需要获取的小伙伴可以直接转发+关注后私信(666)或(111)即可获取!

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

下面给大家分享一份文档《mysql8从入门到精通》教学版!需要获取的小伙伴可以直接转发+关注后私信(666)或(111)即可获取!

看完村口王大爷说的,才懂这才是MYSQL优化的正确姿势

猜你喜欢

转载自blog.csdn.net/x275920/article/details/108400184