MySQL进阶-----索引的语法与SQL性能分析

news/2024/4/29 10:28:33/文章来源:https://blog.csdn.net/m0_73633088/article/details/137114394

目录

前言

一、索引语法

1.SQL语法

2.案例演示

二、SQL性能分析

三、慢查询日志

1.开启日志

 2.测试样例

 四、profile详情

1.开启profile

2.profile测试SQL语句

五、explain详情

1.语法结构

 2.执行顺序示例(id)

3.执行性能示例(type)


前言

        本期就要来去讲解SQL索引的相关语法,已经我们之前所用的SQL语句对其进行性能分析和执行效率来去判断如何来选择合适的SQL语句。下面看正文。(上一期链接:MySQL进阶-----索引的结构与分类-CSDN博客)

一、索引语法

1.SQL语法

1.创建索引
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
index_col_name,... ) ;

 2. 查看索引

SHOW INDEX FROM table_name ;

 3. 删除索引

DROP INDEX index_name ON table_name ;

2.案例演示

先来创建一张表 tb_user ,并且查询测试数据。
create table tb_user(
id int primary key auto_increment comment '主键',
name varchar(50) not null comment '用户名',
phone varchar(11) not null comment '手机号',
email varchar(100) comment '邮箱',
profession varchar(11) comment '专业',
age tinyint unsigned comment '年龄',
gender char(1) comment '性别 , 1: 男, 2: 女',
status char(1) comment '状态',
createtime datetime comment '创建时间'
) comment '系统用户表';INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('吕布', '17799990000', 'lvbu666@163.com', '软件工程', 23, '1',
'6', '2001-02-02 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('曹操', '17799990001', 'caocao666@qq.com', '通讯工程', 33,
'1', '0', '2001-03-05 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('赵云', '17799990002', '17799990@139.com', '英语', 34, '1',
'2', '2002-03-02 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('孙悟空', '17799990003', '17799990@sina.com', '工程造价', 54,
'1', '0', '2001-07-02 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('花木兰', '17799990004', '19980729@sina.com', '软件工程', 23,
'2', '1', '2001-04-22 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('大乔', '17799990005', 'daqiao666@sina.com', '舞蹈', 22, '2',
'0', '2001-02-07 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('露娜', '17799990006', 'luna_love@sina.com', '应用数学', 24,
'2', '0', '2001-02-08 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('程咬金', '17799990007', 'chengyaojin@163.com', '化工', 38,
'1', '5', '2001-05-23 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('项羽', '17799990008', 'xiaoyu666@qq.com', '金属材料', 43,
'1', '0', '2001-09-18 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('白起', '17799990009', 'baiqi666@sina.com', '机械工程及其自动
化', 27, '1', '2', '2001-08-16 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('韩信', '17799990010', 'hanxin520@163.com', '无机非金属材料工
程', 27, '1', '0', '2001-06-12 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('荆轲', '17799990011', 'jingke123@163.com', '会计', 29, '1',
'0', '2001-05-11 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('兰陵王', '17799990012', 'lanlinwang666@126.com', '工程造价',
44, '1', '1', '2001-04-09 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('狂铁', '17799990013', 'kuangtie@sina.com', '应用数学', 43,
'1', '2', '2001-04-10 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('貂蝉', '17799990014', '84958948374@qq.com', '软件工程', 40,
'2', '3', '2001-02-12 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('妲己', '17799990015', '2783238293@qq.com', '软件工程', 31,
'2', '0', '2001-01-30 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('芈月', '17799990016', 'xiaomin2001@sina.com', '工业经济', 35,
'2', '0', '2000-05-03 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('嬴政', '17799990017', '8839434342@qq.com', '化工', 38, '1',
'1', '2001-08-08 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('狄仁杰', '17799990018', 'jujiamlm8166@163.com', '国际贸易',
30, '1', '0', '2007-03-12 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('安琪拉', '17799990019', 'jdodm1h@126.com', '城市规划', 51,
'2', '0', '2001-08-15 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('典韦', '17799990020', 'ycaunanjian@163.com', '城市规划', 52,
'1', '2', '2000-04-12 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('廉颇', '17799990021', 'lianpo321@126.com', '土木工程', 19,
'1', '3', '2002-07-18 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('后羿', '17799990022', 'altycj2000@139.com', '城市园林', 20,
'1', '0', '2002-03-10 00:00:00');
INSERT INTO tb_user (name, phone, email, profession, age, gender, status,
createtime) VALUES ('姜子牙', '17799990023', '37483844@qq.com', '工程造价', 29,
'1', '4', '2003-05-26 00:00:00');

这里我们先去查看这个表的索引:

show index  from tb_user;

这里可以看到索引的名字,以及索引的类型是B+tree 

数据准备好了之后,接下来,我们就来完成如下需求:
A. name 字段为姓名字段,该字段的值可能会重复,为该字段创建索引。
create index index_name on tb_user(name);

再次查看:

B. phone 手机号字段的值,是非空,且唯一的,为该字段创建唯一索引。
create unique index index_phone on tb_user(phone);

C. profession age status 创建联合索引。
create index pro_age_sta on tb_user(profession,age,status);

二、SQL性能分析

MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信
息。通过如下指令,可以查看当前数据库的 INSERT UPDATE DELETE SELECT 的访问频次:
-- session 是查看当前会话 ;
-- global 是查询全局数据 ;
SHOW GLOBAL STATUS LIKE 'Com_______';

Com_delete: 删除次数
Com_insert: 插入次数 
Com_select: 查询次数 
Com_update: 更新次数 
我们可以在当前数据库再执行几次查询操作,然后再次查看执行频次,看看 Com_select 参数会不会变化。

通过上述指令,我们可以查看到当前数据库到底是以查询为主,还是以增删改为主,从而为数据库优化提供参考依据。 如果是以增删改为主,我们可以考虑不对其进行索引的优化。 如果是以查询为主,那么就要考虑对数据库的索引进行优化了。
那么通过查询 SQL 的执行频次,我们就能够知道当前数据库到底是增删改为主,还是查询为主。 那假如说是以查询为主,我们又该如何定位针对于那些查询语句进行优化呢? 次数我们可以借助于慢查询日志。
接下来,我们就来介绍一下 MySQL 中的慢查询日志。

三、慢查询日志

1.开启日志

慢查询日志记录了所有执行时间超过指定参数( long_query_time ,单位:秒,默认 10 秒)的所有
SQL 语句的日志。
MySQL 的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_log
show variables like 'slow_query_log';

如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

这里我们先通过vi /etc/my.cnf 指令进入到mysql里面进行对配置文件的编辑

配置完毕之后,通过以下指令重新启动 MySQL 服务器进行测试,查看慢日志文件中记录的信息
/var/lib/mysql/localhost-slow.log
systemctl restart mysqld

 然后,再次查看开关情况,慢查询日志就已经打开了。

 2.测试样例

A. 执行如下 SQL 语句 :
select * from tb_user; -- 这条SQL执行效率比较高, 执行耗时 0.00sec
select count(*) from tb_sku; -- 由于tb_sku表中, 预先存入了1000w的记录, count一次,耗时
13.35sec

B. 检查慢查询日志 :
最终我们发现,在慢查询日志中,只会记录执行时间超多我们预设时间( 2s )的 SQL ,执行较快的 SQL是不会记录的。

 

这样,通过慢查询日志,就可以定位出执行效率比较低的 SQL ,从而有针对性的进行优化。

 四、profile详情

1.开启profile

show profiles 能够在做 SQL 优化时帮助我们了解时间都耗费到哪里去了。通过 have_profiling
参数,能够看到当前 MySQL 是否支持 profile 操作:
SELECT @@have_profiling ;

可以看到,当前 MySQL 是支持 profile 操作的,但是开关是关闭的。可以通过 set 语句在
session/global 级别开启 profiling
查看profile是否开启:
select @@profiling;

如果显示0就表示未开启,那就要去开启:

SET profiling = 1;

2.profile测试SQL语句

开关已经打开了,接下来,我们所执行的 SQL 语句,都会被 MySQL 记录,并记录执行时间消耗到哪儿去了。 我们直接执行如下的SQL 语句:
select * from tb_user;
select * from tb_user where id = 1;
select * from tb_user where name = '白起';
执行一系列的业务 SQL 的操作,然后通过如下指令查看指令的执行耗时:
-- 查看每一条SQL的耗时基本情况
show profiles;
-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;
查看每一条 SQL 的耗时情况 :

查看指定 SQL各个阶段的耗时情况 :

五、explain详情

1.语法结构

EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序

 语法:

-- 直接在select语句之前加上关键字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;

Explain 执行计划中各个字段的含义: 

字段

含义

id

select查询的序列号,表示查询中执行select子句或者是操作表的顺序

(id相同,执行顺序从上到下;id不同,值越大,越先执行)。

select_type

表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、

UNION(UNION 中的第二个或者后面的查询语句)、

SUBQUERY(SELECT/WHERE之后包含了子查询)等

type

表示连接类型,性能由好到差的连接类型为NULL、system、const、

eq_ref、ref、range、 index、all 。

possible_key

显示可能应用在这张表上的索引,一个或多个。

key

实际使用的索引,如果为NULL,则没有使用索引。

key_len

表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越好 。

rows

MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。

filtered

表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好。

 2.执行顺序示例(id)

数据准备:

# 创建学生信息表
create table students
(id   int auto_incrementprimary key,name varchar(10) null,num  varchar(20) null,constraint students_num_uindexunique (num)
);
#创建中间连接表 
create table stu_cour
(stu_id  int null,cour_id int null,constraint stu_cour_courses_id_fkforeign key (cour_id) references courses (id),constraint stu_cour_students_id_fkforeign key (stu_id) references students (id)
);
# 创建课程表
create table courses
(id     int         not nullprimary key,c_name varchar(10) null
);# 数据插入
insert into students values (1,'韩信','123451'),(2,'李白','123452'),(3,'公孙离','123453'),(4,'司马懿','123454');insert into courses values (1,'mysql'),(2,'java'),(3,'python');insert into stu_cour values (1,2),(1,3),(2,1),(2,3),(3,3);

 关系如图所示:

explain语句结果中select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。

 (1)id相同案例:

explain select s.*,c.* from students s,stu_cour sc,courses c where s.id=sc.stu_id and c.id=sc.cour_id;

(2)id不同时案例:

explain select * from students where id=(select stu_id from stu_cour where cour_id=(select id from courses where c_name='mysql'));

3.执行性能示例(type)

(1)如果查询全部的话那就是全部扫描,结果为all

explain select * from tb_user;

(2)如果查询指定条件的话,但没有建立索引,结果如下:

explain select * from tb_user where name='韩信';

(3)如果查询有建立索引的条件的话,结果如下:

explain select * from tb_user where id=2;

 以上就是本期的全部内容,我们下次见!

分享一张壁纸:

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题--最长连续序列

洛阳春-岑参 人到洛阳花似锦,偏我来时不逢春。 谁道三冬无春色,冰山高处万里银 目录 题目描述 思路分析 方法及其时间复杂度 法一 暴力枚举: 法二 哈希表遍历: 法三 并查集: 个人总结 题目描述 128. 最长连续序…

JVM快速入门(2)HotSpot和堆、新生区、永久区、堆内存调优、JProfiler工具分析OOM原因、GC(垃圾回收)、JVM经典面试笔试题整理

5.6 HotSpot和堆 5.6.1 Hotspot 三种JVM: Sun公司,HotspotBEA,JRockitIBM,J9 VM,号称是世界上最快的Java虚拟机 我们一般学习的是:HotSpot 5.6.2 堆 Heap,一个JVM只有一个堆内存&#xff0c…

【I.MX6ULL移植】Ubuntu-base根文件系统移植

1.下载Ubuntu16.04根文件系统 http://cdimage.ubuntu.com/ 1 2 3 4 5 2.解压ubuntu base 根文件系统 为了存放 ubuntu base 根文件系统,先在 PC 的 Ubuntu 系统中的 nfs 目录下创建一个名为 ubuntu_rootfs 的目录,命令如下: 【注意&…

【IP 组播】PIM-SM

目录 原理概述 实验目的 实验内容 实验拓扑 1.基本配置 2.配置IGP 3.配置PIM-SM 4.用户端DR与组播源端DR 5.从RPT切换到SPT 6.配置PIM-Silent接口 原理概述 PIM-SM 是一种基于Group-Shared Tree 的组播路由协议,与 PIM-DM 不同,它适合于组播组成…

【word技巧】word复制整页格式不变,如何做到?

Word文档内容中的某页需要复制粘贴到其他word文档,如何做才能保持整页格式不变?今天分享几个方法,帮助大家解决word复制整页格式不变。 方法一: 最简单的方法就是,找到需要复制的页面,从第一行使用光标选…

鸿蒙TypeScript开发入门学习第3天:【TS基础类型】

1、TypeScript 基础类型 TypeScript 包含的数据类型如下表: 注意: TypeScript 和 JavaScript 没有整数类型。 2、Any 类型 任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。 1、变量的值会动态改变时&…

连续信号离散信号的功率谱密度--用MATLAB求功率谱密度

连续信号&离散信号的功率谱密度--用MATLAB求功率谱密度 目录 前言 一、能量及功率定义 1、连续信号 2、离散信号 二、功率谱密度计算公式 三、MATLAB仿真 1、源代码 2、仿真结果分析 总结 前言 一直对数字信号处理中的功率谱密度计算有点好奇,虽然MATLAB有提供现…

提升K8S故障排除效率:详解Pod内抓包的高效策略!

在Kubernetes环境中,故障排除是管理者日常工作中不可或缺的一部分。随着容器化应用的广泛采用,需要一种高效的方法来诊断和解决Pod内部的问题。本文将重点介绍如何利用抓包技术提升Kubernetes环境中Pod内部故障排除的效率。 为什么需要Pod内抓包 在Kube…

零售商品计划新篇章:智能管理系统的挑战与机遇

在零售企业管理中,商品计划管理在零售企业运营中占据核心地位。面对日益激烈的市场竞争和消费者需求的多样化,零售企业在商品计划管理方面面临着诸多挑战和需求。以下针对这些挑战和需求的分析,以及对一套智能商品计划管理系统应具备的功能和…

高效运维|AIRIOT智慧电力运维解决方案

可再生能源的引入带来了能源生产的去中心化和分散化趋势,同时也带来了能源输出的波动性和不确定性。电力运维因此需要更加灵活、智能的解决方案,以适应可再生能源的集成,确保电力系统的稳定运行,传统的电力运维管理方式往往存在如…

Vite 为什么比 Webpack 快?

目录 1. Webpack 的构建原理 2. Script 的模块化(主流浏览器对 ES Modules 的支持) 3. Webpack vs Vite 开发模式的差异 对 ES Modules 的支持 底层语言的差异 热更新的处理 1. Webpack 的构建原理 前端之所以需要类似于 Webpack 这样的构建工具&…

【教学类-40-09】A4骰子纸模制作9.0(3.47CM嵌套骰子 一条8格便于对折,表格相连 一页3个 油墨打印A4铅画纸)

作品展示 背景需求: 骰子调整到第8版,把骰子图案作成一长条,便于切割裁剪。 【教学类-40-08】A4骰子纸模制作8.0(2.97CM嵌套骰子表格相连 一页7个 油墨打印A4铅画纸)-CSDN博客文章浏览阅读929次,点赞20次…

如何解决绩效考核中“手松手紧”的问题

遇到的问题: l 评价时不同领导评分标准宽严程度不一,主观影响大 “严父”型领导,评分标准较高,严格评分,导致得分偏低。 “慈母”型领导,评分标准较低,评分宽松,导致得分偏高。…

区块链dapp开发 dapp系统开发方案

在区块链技术的兴起和普及的推动下,去中心化应用程序(DApp)成为了当前数字世界中的热门话题之一。DApp 的开发不仅需要考虑技术方面的挑战,还需要深入了解区块链的工作原理和应用场景。本文将介绍一种 DApp 系统开发的基本方案&am…

PHP开发全新29网课交单平台源码修复全开源版本,支持聚合登陆易支付

这是一套最新版本的PHP开发的网课交单平台源代码,已进行全开源修复,支持聚合登录和易支付功能。 项目 地 址 : runruncode.com/php/19721.html 以下是对该套代码的主要更新和修复: 1. 移除了论文编辑功能。 2. 移除了强国接码…

Github 2024-03-28Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-28统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9非开发语言项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:…

Ubuntu18.04 下Ublox F9P 实现RTK (利用CORS服务无需自建基站)

本内容参考如下连接:Ubuntu下Ublox F9P利用CORS服务无需自建基站实现RTK-CSDN博客 一、Ublox F9P 硬件模块示意图 图中展示了Ublox F9P的接口,包括串口2(`UART1`和`UART2`),USB1。需要人为通过u-center(Ublox F9P的显示软件)软件设置以下功能: Ublox通过`UART1`向PC端发送…

Web Components使用(一)

在使用Web Components之前,我们先看看上一篇文章Web Components简介,其中提到了相关的接口、属性和方法。 正是这些接口、属性和方法才实现了Web Components的主要技术:Custom elements(自定义元素)、Shadow DOM&#…

百度智能云推出AI大模型全家桶;抖音发布 AI 生成虚拟人物治理公告

百度智能云推出大模型全家桶 百度智能云昨日在北京首钢园召开「Al Cloud Day: 大模型应用产品发布会」,此次发布会上,百度智能云宣布对以下 7 款产品进行升级。 数字人平台百度智能云曦灵智能客服平台百度智能云客悦内容创作平台「一念」知识智平台「甄…

GPT:多轮对话并搭建简单的聊天机器人

1 多轮对话 多轮对话能力至关重要,它不仅能深化交流,精准捕捉对方意图,还能促进有效沟通,增强理解。在智能客服、教育辅导等领域,多轮对话更是提升服务质量、增强用户体验的关键。 注意:大模型没有多轮对话…