MySQL高级--SQL优化


1.体系结构图

在这里插入图片描述

  • Connection Pool :连接池组件
  • Management Service & Utilities :管理服务和工具组件
  • SQL Interface : SQL接口组件
  • Parser :查询分析器组件
  • Optimizer :优化器组件
  • Cache & Buffers :缓冲池组件
  • Pluggables Storage Engines : 存储引擎
  • File System :文件系统

1)连接层
在这里插入图片描述

最上层是一些客户端连接,包含本地sock通信和基于客户端/服务端实现的通信 ,主要完成授权处理、授权认证及相关的安全方案。

2)服务层
在这里插入图片描述

完成sql的解析并生成解析树,进行sql的分析和优化,包括判断是否利用索引等,最后生成相应的执行操作,如果是查询语句,mysql服务还会查询内部的缓存。

3) 引擎层

在这里插入图片描述
存储引擎真正负责数据的存储和提取,服务器通过API和存储引擎进行通信,MySQL插件式的存储引擎结构,将查询处理和和其它系统任务分离。这种架构可以使开发人员根据业务的需求选择合适的引擎,使得MySQL在各种应用场景中发挥良好的作用。

4) 存储层

在这里插入图片描述
将数据存储在文件系统中,完成与存储引擎的交互。


2.存储引擎

存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,存储引擎是表类型。

2.1查看数据库中的存储引擎

在这里插入图片描述
2.2MyISAM和InnoDB的区别
在这里插入图片描述

2.3存储引擎的选择
  • InnoDB:MySQL默认的存储引擎,支持事务、外键、行级锁,适用于对事务完整性要求较高、高并发下对数据完整性高、数据操作多以更新和删除操作为主的场景。
  • MyISAM:使用于以查询和插入操作为主,更新和删除操作较少,并对事务的完整性、高并发下数据的一致性不高的系统。例如:博客系统。

综上所述,对于复杂的应用系统,可以选择多种存储引擎进行组合使用。


3.SQL语句优化

3.1SQL语句优化步骤

3.1.1查看SQL语句的执行频率(借鉴性指标)

查看数据库全局的增删改查次数

在这里插入图片描述

查看InnoDB存储引擎增删改查执行的次数

在这里插入图片描述

3.1.2 定位低效率执行SQL

实时监测sql语句的执行情况

在这里插入图片描述

慢查询日志

通过慢查询日志定位执行效率低的sql语句,相比于实时监测,慢查询日志是在查询结束后进行记录。

3.1.3 explain分析执行计划

explain查看sql语句执行结果

在这里插入图片描述

  • explain之id(控制表结构的加载顺序):

    1. id 相同表示加载表的顺序是从上到下
      在这里插入图片描述

    2. id不同表示id值越大,优先级越高,越先被执行
      在这里插入图片描述

    3. id值有的相同,有的不同表示id值高的先执行,相同的依次执行

  • explain之select_type:
    在这里插入图片描述

  • explain之type
    在这里插入图片描述

type结果值在表中排序越靠上,查询速度越快。一般来说我们至少需要保证查询达到range级别,最好达到ref。

  • explain之key
  1. possible_key : 表示可能用到的索引
  2. key : 实际使用的索引
  3. key_len : 表示索引的字节数长度(最大可能长度),在不损失进度的情况下,索引越短越好。
  • explain之row
    表示扫描的行数。
  • explain之extra
    额外的信息
  1. using filesort : 表明mysql使用外部的索引排序,陈为文件排序。
  2. using temporary:表明查询过程中使用临时表保存中间结果,常见于order by和group by。
  3. use index :表示相应的select操作使用了覆盖索引,避免了访问表的数据行。

前俩种情况比较耗性能需要考虑优化,我们要尽可能保持为第三种情况。

3.1.4 show profilefe分析SQL

帮助我们分析sql语句具体耗时在什么地方

show profile 配置

在这里插入图片描述

show profile 使用

在这里插入图片描述
在这里插入图片描述

3.1.5 trace分析优化器执行计划

优化器
在这里插入图片描述

通过使用trace可以查看优化器的执行计划。

3.2 正确使用索引法则

1)全值匹配,对索引中的所有列都指定具体的值。
2)最左前缀法则,匹配最左前缀法则走索引,违反最左前缀法则索引失效。
3)范围查询右边的查询条件索引失效。
4)在索引列上进行运算操作索引失效。
5)字符串不加单引号索引失效,本质是对索引进行了运算。
6)尽量使用覆盖索引,避免使用select *。因为select * 始终会进行回表操作。
7)用or分割开的查询条件,有一个条件没有走索引,所有的条件都不会走索引。
8)以%开头的模糊查询索引失效。(可以通过覆盖索引优化)。
9)如果使用索引比全表查询更慢,MySQL默认会不使用索引。
10)is null,is not null 有时会索引失效,走全表查找。
11)in走索引,not in不走索引。
12)尽量使用复合索引,而少使用单列索引。因为MySQL对于多个单列索引会选择使用分辨度最高的一个索引进行使用。而创建一个复合索引相当于创建了多个索引。

3.3SQL优化

3.1 优化insert语句
  • 如果需要对一张表同时插入很多行数据时,应尽量使用多个值表示的inset语句,这种方式将大大缩减客户端与服务端对连接资源的消耗。
  • 在事务中进行插入。
  • 数据有序插入。
3.2 优化group by语句
  • 如果使用group by只想起到分组的效果,可以执行order by null禁止排序,来提升查询效率。应为group by时会默认进行order by。
  • 为group by的条件创建索引。
3.3 优化嵌套查询(子查询)
  • 尽量使用多表联查替换子查询
3.4 优化or查询
  • 使用union来代替or(Mysql5.6后自动实现)
3.5 优化分页查询
  • 在索引上完成分页查询操作,最后根据主键关联回表查询。
  • 对于主键自增的表,可以把limit查询转换为某个位置的查询(而且不能出现断层,出现断层后数据会不准确)。

猜你喜欢

转载自blog.csdn.net/weixin_44017425/article/details/107856153