当前位置: 首页 > news >正文

说说SQL调优

SQL调优主要可以从三个方面来讲,分别是硬件调优、架构调优sql语句调优

硬件调优

升级服务器硬件配置,例如cpu、内存和磁盘

适当调大buffer pool的内存调大connection的连接数

架构调优

主从架构读写分离,

搭建集群,

引入redis缓存,

分库分表

sql语句调优

定长的字符串字段,使用固定长度char类型,字符串长度动态变化的则使用varchar类型

时间类型字段尽量使用timestamp,占用字节数少,并且够用

一些枚举尽量使用int或者tniyint

禁止使用select *,需要查询什么列数据就查询什么;

尽量使用小表驱动大表;

limit大分页优化:select * from user where id>10000 limit 10;

建立合适的索引,提高索引的命中率,减少回表次数;

多个字段建立联合索引,查询时where后面的查询条件要满足最左前缀匹配原则;

sql执行慢不走索引,通过explain分析工具查看sql执行情况,对症下药修改sql;

索引失效,过explain分析工具查看sql执行情况,并修改sql语句,减少索引失效;

索引列上使用函数、like模糊查询以%通配符开头、范围查询未放到最后面

拓展知识

explain关键字的使用

Explain sql语句 可以清楚的掌握sql的执行计划和sql使用索引的情况以及排序字段是否用到索引,排序是否在内存中排序的还是放在磁盘中排序的。

type列

type列为访问类型,包含:all、index、range、ref、eq_ref、const、system共7种。 效率从高到低顺序为: system > const > eq_ref > ref > > range > index > ALL

all:全表扫描,最好不要出现这种情况,最慢的查询情况

index:扫描二级索引,如果Extra有Using index表示正在使用覆盖索引

range:范围扫描,当使用=、<>、>、>=、BETWEEN时,用常量比较关键字列时

ref:它返回所有匹配某个单个值的行,只有当使用非唯一性索引会发生,使用索引的最左前缀

eq_ref:join的时候最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生

const:用主键和唯一键进行查询时

system:const特例

possible_keys

查询中可能使用的索引列表。

key列

实际使用的索引名称

key_len列

联合索引或者主键索引实际走了多少个字节,实际使用到的索引长度 (即:字节数)

帮你检查是否充分的利用了索引值越大越好,主要针对于联合索引,有一定的参考意义。

Extra

额外的信息,描述 MySQL 执行查询时的额外操作,例如:

  • Using where:查询中有 where 子句的过滤
  • Using index:只使用索引,即索引覆盖,没有访问表数据。
  • Using index condition:有些搜索条件中虽然有索引列,但却不能使用到索引
  • Using filesort:查询需要额外的排序操作(MySQL 的内部排序算法)。

为什么小表驱动大表效率就高很多?

小表驱动大表创建连接的次数少,速度快

小表驱动大表需要加载到join Buffer连接缓冲池的数据小,速度快

Join Buffer(连接缓冲区)是优化器用于处理连接查询操作时的临时缓冲区。简单来说当我们需要比较两个或多个表的数据进行Join操作时,Join Buffer可以帮助MySQL临时存储结果,以减少磁盘读取和CPU负担,提高查询效率。需要注意的是每个join都有一个单独的缓冲区。

Block nested-loop join(BNL算法)会将驱动表数据加载到join buffer里面,然后再批量与非驱动表进行匹配;如果驱动表数据量较大,joinbuffer无法一次性装载驱动表的结果集,将会分阶段与被驱动表进行批量数据匹配,会增加被驱动表的扫描次数,从而降低查询效率。所以开发中要遵守小表驱动大表的原则。

分阶段匹配过程如下:

1、先把student表前15条数据读到join buffer中。

2、然后用scores表去匹配joinbuffer中的前15条。

3、记录下匹配结果。

4、清空joinbuffer。

5、再把student表后15条读取join buffer中。

6、然后用scores表去匹配join buffer中的后15条。

7、记录下匹配结果。

Join查询时,如何选择驱动表与被驱动表?

在JOIN查询中经常用到的 inner join、left join、right join问题解答:

1.当使用left join时,左表是驱动表,右表是被驱动表;

2.当使用right join时,右表时驱动表,左表是被驱动表;

3.当使用inner join时,mysql会选择数据量比较小的表作为驱动表,大表作为被驱动表 ;


http://www.mrgr.cn/news/59332.html

相关文章:

  • 软考系统分析师知识点二四:错题集11-20
  • 【FreeRL】TD3和SAC的实现
  • libharu 中文问题
  • 君正 T31 型号芯片架构模块介绍
  • 在平面模型上提取凹多边形的点云处理
  • 【Canvas与桌面】文山甲密铺桌面壁纸 1920*1080
  • 编写一个简单的Iinput_dev框架
  • 量子变分算法 (python qiskit)
  • 《Contrastive Language-Image Pre-Training with Knowledge Graphs》中文校对版
  • 基于JAVA+SpringBoot+Vue的华府便利店信息管理系统
  • 最新PHP网盘搜索引擎系统源码 附教程
  • 个体化神经调控 Neurolnavigation介绍
  • 基于SSM“多鱼”旧物交易平台的设计与实现
  • shodan2:绕过shodan高级会员限制+metasploit批量验证漏洞
  • Python浪漫之画一个圆月亮
  • 6.Linux按键驱动-阻塞与非阻塞
  • 安全知识见闻-脚本语言对与安全的重要性
  • 使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】
  • 索引的使用和优化
  • 基于SSM“毛毛宠物店”宠物信息交流平台的设计与实现