如何优化 MySQL

news2024/12/24 3:58:10

为什么要对 SQL 进行优化

有时候数据库会出现性能低、执行时间太长、等待时间太长、SQL 语句欠佳(连接查询)、索引失效等问题,这些问题会严重拖慢一个系统的速度,因此需要对 SQL 进行优化。

SQL 的编写过程和解析过程并非是一致的,下面是两者执行的先后顺序:

编写过程:

select..from..join..on..where..group by...having..order by...limit.

解析过程:

from..on..join..where..group by....having...select..order by...limit..

SQL 如何优化
SQL 优化,主要就是在优化索引。索引相当于书的目录,是帮助 MySQL 高效获取数据的数据结构。就好比查字典,如果没有目录查一个字就需要遍历整本字典,而有了目录之后只需要按目录查询。索引的数据结构有(树:B+树(默认)、Hash 树等等)。

索引的优势

  1. 提高查询效率(降低 IO 使用率)。
  2. 降低 CPU 使用率。

索引的弊端

  1. 索引本身很大,需要存放在内存/硬盘(通常为硬盘)。

  2. 索引不是所有情况均适用,以下三种情况不适合用索引:少量数据、频繁更新的字段、很少使用的字段。

  3. 索引提高了查询速度,但是会降低增删改的效率。

关于索引的分类

  1. 单值索引:单列的索引,比如学生表中的 name。一个表可以有多个单值索引。

  2. 唯一索引:与单值索引的区别是属性不能重复。比如主键 id。

  3. 主键索引:与唯一索引的区别是内容不能为 null。

  4. 复合索引:多个列构成的索引,(name,grade)构成索引后先查 name,再查 grade。

如何创建索引

方法一:create 索引类型 索引名 on 表(字段):

单值索引:
create index name_index on student(name);
唯一索引:
create unique index id_index on student(id);
复合索引:
create index name_grade_index on student(name,grade);

方法二:alter table 表名 add 索引类型 索引名(字段):

单值索引:
alter table student add index name_index(name);
唯一索引:
alter table student add  unique index id_index(id);
复合索引:
alter table student add index name_grade_index(name,grade);

删除索引

drop index 索引名 on 表名

explain 关键字

通过 explain 关键字可以看到 SQL 语句的执行过程中的一系列问题。explain 经常被用来查找慢 SQL 的原因。

explain 关键字的使用很简单,只需要在执行的 SQL 前加上 explain 即可。
在这里插入图片描述
输出的结果中的 type、key、key_len、Extra 需要尤其注意。

1、 id:标识符

如果有多个 id,id 值相同,顺序执行;id 值不同,id 值越大越优先查询。

2、 select_type:查询类型

  • primary:包含子查询 SQL 中的主查询(最外层)。

  • subquery:包含子查询 SQL 中的子查询(非最外层)。

  • simple:简单查询(不包含子查询、union)。

  • derived:衍生查询(使用到了临时表)。

  • union:当查询时用到了 table1 union table2,table1 类型是 derived,table2 的类型是union。

  • union result:从 union 表获取的 select。

3、 table

查询的是哪张表。

4、 type:索引类型

system > const > eq_ref > ref > range > index > all

system 和 const 存在于理想状态,实际能达到 ref,索引的优化一般到 ref 为止。

const:仅仅能查到一条数据的 SQL,用于主键索引和唯一索引。

eq_ref:唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有 1 个,不能多、不能 0)。

ref:非唯一性索引,对于每个索引键的查询,返回匹配的所有行。

range:检索指定范围的行,where 后面是一个范围查询(between,>,<)等。

index:查询全部索引中的数据。

all:查询全部表中的数据。

5、 possible_keys

可能用到的索引。

6、 key

实际用到的索引。

7、 key_len

索引的长度,用于判断复合索引是否被完全使用。

8、 ref

指明当前表所参照的字段。

9、 rows

被索引优化查询的数据个数(实际通过索引查询到的数据个数)。

10、 Extra

  1. using filesort:性能消耗大,需要“额外”的一次排序,常见于 orderby 语句。

  2. using temporary:性能损耗大,用到了临时表,一般出现在 groupby 中。

  3. using index:性能提升;索引覆盖(覆盖索引)。原因:不读取原文件,只从索引文件中获取数据。

  4. using where:回表查询。

索引优化实例

建一张 book 表,插入一些数据:

create table book
 (
     bid int(4) primary key,
     name varchar(20) not null,
     authorid int(4) not null,
     typeid int(4) not null
);
insert into book values(1,'java',1,1);
insert into book values(2,'c',2,2);
insert into book values(3,'math',3,3);
insert into book values(4,'english',4,3);

首先不建立索引查看结果:

explain select bid from book where typeid in(2,3) and authorid=2 order by bid;

在这里插入图片描述虽然没有主动建立索引,但是 mysql 自动建立了主键索引,现在的 type 是 index,继续优化。

添加一个复合索引,将查询时所用到的属性均加入进去:

alter table book add index a_t_b(authorid,typeid,bid);

再次运行查询语句:
在这里插入图片描述此时 type 从 index 升级到了 range,并且查询走了 a_t_b 索引。虽然看上去是一个小小的优化,实际在生产环境上能提升几倍或几十倍的查询速度。

加索引的技巧

1、 小表驱动大表:

select ... from .... where 小表.x=大表.x;

2、 索引建立在经常使用的字段上。

3、exist 和 in:

如果主查询的数据集大,则使用 in,如果子查询的数据集大,则使用 exist:

select .. from table where exist/in (子查询)

4、order by 优化:

  1. 避免 select *的使用

  2. 复合索引不要跨列使用

  3. 保证所有排序字段排序顺序的一致性(都是升序或降序)。

5、最左前缀原则

建立组合索引 (a,b,c),则可以利用到索引的查询条件是:

  • where a = ?
  • where a = ? and b = ? (注意与条件的先后次序无关,也可以是 where b = ? and a = ?,只要出现即可)
  • where a = ? and b = ? and c = ? (注意事项同上)

不能利用的例子:

  • where b = ?
  • where b = ? and c = ?
  • where c = ?

特殊情况:

  • where a = ? and c = ?(a = ? 会利用索引,但 c = ? 不能利用索引加速,会触发索引条件下推)

避免索引失效的原则

1、复合索引不要跨列或无序使用(最佳左前缀):索引的顺序和 SQL 语句查询时的顺序一致。

2、复合索引尽量使用全索引匹配。

3、不要在索引上进行任何操作(计算、函数、类型转换)。

4、like 尽量以“常量”开头,不要以%开头,否则索引失效。

5、尽量不要使用类型转换(显示、隐式),否则索引失效,如 name 的属性是 varchar,这里变成了 int:

select * from teacher where name=123

6、两个表或者字段编码格式不同导致索引失效,比如 table1 编码格式是 utf8,table2 编码格式是 utf8mb4,两个表 join 时 on 字段就无法走索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt样式表语法

样式规则每个样式规则由选择器和声明组成。选择器&#xff1a;指定受该规则影响的部件。声明&#xff1a;指定这个部件上要设置的熟悉如&#xff1a;QPushButton{color:red} QPushButton是选择器&#xff1b;{color:red}是声明&#xff1b;color是属性&#xff1b;red是值。选择…

使用prometheus监控ES

下载elasticsearch_exporter wget 下载二进制包并解压、运行&#xff1a; wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.linux-a…

ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)

本文利用6818开发板完成LCD屏上绘制任意的矩形&#xff0c;圆形&#xff0c;三角形或五角星形图案&#xff0c;还有绘制太极&#xff0c;五星红旗的方案。 目录 映射 绘制矩形 代码思路 代码实现 实践出真知 绘制圆形 代码思路 代码实现 绘制三角形 代码思路 代码实现…

【回答问题】ChatGPT上线了!用给写出可执行的实体链接模型

如何实现一个实体链接模型/代码 在实现实体链接模型之前&#xff0c;您需要确定所要链接的实体类型&#xff08;例如人名、地名、组织机构等&#xff09;。然后&#xff0c;您需要准备一份包含大量实体及其相应识别码的实体百科数据集。接着&#xff0c;您可以使用深度学习模型…

乾元通多卡聚合通信系统在应急通信领域的解决方案

后疫情时代&#xff0c;日益增多的大型集会类事件给现有通信系统带来极大的压力。目前&#xff0c;我国已经认识到应急通信系统的重要性&#xff0c;因此我国各个部门已经配置了不少应急通信系统和设备&#xff0c;并且积累了相当的使用经验。 在不同情况下&#xff0c;对应急…

基础数据结构——数组

目录 一、前言 二、一维数组 1、定义和初始化 2、一维变长数组 3、一维正向遍历 4、一维反向遍历 5、一维数组区间操作、一维数组从 a[1] 开始&#xff0c;读入一维数组 6、一维数组例题1 7、一维数组例题2 三、二维数组 1、二维数组初始化 2、三维数组初始化 3…

HTTP_day02

掘金地址 结合 小林 coding 当键入网址后&#xff0c;到网页显示&#xff0c;其间发生了什么 DNS 服务器 专门保存了 Web 服务器域名与 IP 的对应关系 域名用“.”分隔成多个单词&#xff0c;级别从左到右逐级升高&#xff0c;最右边的被称为“顶级域名” DNS 服务器是一个分…

聊聊Spring中最常用的11个扩展点

前言 我们一说到spring&#xff0c;可能第一个想到的是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。 没错&#xff0c;它们是spring的基石&#xff0c;得益于它们的优秀设计&#xff0c;使得spring能够从众多优秀框架中脱颖而出。 除…

第三十六讲:神州无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便&#xff0c;需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置&#xff0c;保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN&#xff0c;广播SSID,启用VAP&#xff0c;若无其他DHCP服务器的话&#x…

业务状态实时监控预警,「告警配置」来帮您

腾讯云数据连接器iPaaS团队服务了各行各业的数百家客户后&#xff0c;发现许多企业有大量的自建应用/SaaS应用&#xff0c;却缺乏一套可靠灵活的告警系统。当相关的IT系统/资源调配出现故障后&#xff0c;往往是影响到业务系统被用户投诉后&#xff0c;技术人员才发现故障并展开…

【超详细】LightGBM介绍与应用

目录 1. LightGBM简介 2. LightGBM详细介绍 2.1 单边梯度抽样算法 2.2 直方图算法 2.3 互斥特征捆绑算法 2.4 基于最大深度的 Leaf-wise 的垂直生长算法&#xff08;带深度限制的 Leaf-wise 算法&#xff09; 2.5 类别特征最优分割 &#xff08;直接支持类别特征&#xf…

【自学Python】Windows安装Python

Windows安装Python Python下载 Python下载地址 https://www.python.org/Python下载 打开上面的链接&#xff0c;打开 Python 的下载页面&#xff0c;如下图所示&#xff1a; 我们把鼠标放到 Downloads 上&#xff0c;然后点击 Windows&#xff0c;此时界面如下图所示&#…

Docker简介

Docker官网链接&#xff1a; http://docker.p2hp.com/问题&#xff1a;我们开发的嵌入式项目基本是基于虚拟机下的ubuntu的&#xff0c;如果每一个项目要求的系统版本、库版本、交叉编译工具链等不一样&#xff0c;我们就需要为每一个项目安装一个对应的ubuntu&#xff0c;这既…

【Leetcode】111. 二叉树的最小深度

一、题目 1、题目描述 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2…

4.0、Linux-文件属性查看和修改学习

4.0、Linux-文件属性查看和修改学习 基本属性 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限&#xff1b;为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限…

Linux0基础入门,教你如何在Shell中使用正则表达式

正则表达式 在 shell 脚本中成功运用 sed 编辑器和 gawk 程序的关键在于熟练使用正则表达式。这可不是件简单的事&#xff0c;从大量数据中过滤出特定数据可能会&#xff08;而且经常会&#xff09;很复杂。本章将介绍如何在 sed 编辑器和 gawk 程序中创建正则表达式来过滤出需…

聚观早报 | 元旦机票预订量增长145%;小米集团副总裁崔宝秋离职

今日要闻&#xff1a;元旦跨境机票预订量增长145%&#xff1b;小米集团副总裁崔宝秋离职&#xff1b;抖音推出桌面端聊天软件&#xff1b;《阿凡达2》全球票房破14亿美元&#xff1b;苹果 A17 芯片要用 3nm 工艺元旦跨境机票预订量增长145% 1 月 2 日&#xff0c;各旅游平台发布…

小工具集锦,5款好用的良心软件

今天来给大家推荐5款良心软件,每款都是经过时间检验的精品,用起来让你的工作效率提升飞快&#xff0c;各个都让你觉得相见恨晚&#xff01; 1.高效截图——Snipaste 我曾经尝试过 FastStone Capture、ShareX 等多款截图软件&#xff0c;直到遇见 Snipaste 才画上句点。除了基…

“当不存在跨域问题,也解决了数据验证时,还出现:No ‘Access-Control-Allow-Origin‘,说存在跨域问题 ”的解决办法

不存在跨域问题&#xff0c;数据验证也弄好了&#xff0c;还出现下面的问题&#xff1a;Access to XMLHttpRequest at https://m.maizuo.com/gateway?cityId440100&pageNum1&pageSize10&type1&k7325551 from origin http://localhost:8080 has been blocked b…

OpenCv:直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)

总结了使用Python OpenCv处理图像直方图均衡化(HE)&#xff0c;自适应直方图均衡化(AHE)&#xff0c;限制对比度自适应直方图均衡化(CLAHE)的方法。 目录直方图均衡化(HE)自适应直方图均衡化(AHE)限制对比度自适应直方图均衡化(CLAHE)代码测试结果场景1场景2直方图均衡化(HE) …