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

【Mysql】我在广州学Mysql 系列—— 性能优化相关例题

ℹ️大家好,我是练小杰,时间过得真快,还有2天,2025年2月份就结束了!!😆


本文是针对Mysql数据库中有关性能优化的相关示例,通过本文的学习可以深入了解性能优化的各类命令!!!🙏

前情回顾: 【Mysql 性能优化详解】
数据库专栏:👉【数据库专栏】【Mysql练习题】

主页:👉【练小杰的CSDN】

真正的平静是内心的平静~~

在这里插入图片描述

性能优化例题

    • 主页:👉【[练小杰的CSDN](https://blog.csdn.net/weixin_55767624?spm=1011.2415.3001.5343)】
    • 真正的平静是内心的平静~~
  • 前言
  • 使用EXPLAIN命令
    • 使用EXPLAIN语句来分析一个查询语句
  • 对比查询中不使用索引和使用索引
    • 未使用索引时的查询情况
    • 使用索引时的查询情况
  • LIKE关键字
    • 分析"查询以`x`结尾的水果名字" 命令
    • 分析"查询以`x`开头的水果名字" 命令
  • 多列索引
    • 创建多列索引
    • 验证多列索引的使用情况
  • or 关键字查询优化
    • 分析水果名字为apple或id号为101的情况
    • 分析水果名字为apple或id号为l2的情况
  • JOIN 命令查询
    • members表和members_detail表数据
    • 查询结果的几种情况
  • 优化插入命令
    • 新建会员信息表和会员组信息表
  • ANALYZE TABLE 命令分析表

在这里插入图片描述

前言

记得学习本文之前,先了解博客👉【Mysql 性能优化详解】,再进行本博客的各类操作噢!!!😆

使用EXPLAIN命令

为了方便理解EXPLAIN命令,首先在数据库中创建数据表并插入数据,以下是详细命令:

  • 创建数据表fruits
CREATE TABLE fruits
(
f_id    char(10)     NOT NULL,
s_id    INT        	NOT NULL,
f_name  char(255)  	NOT NULL,
f_price decimal(8,2)  	NOT NULL,
PRIMARY KEY(f_id)   
);
  • 在表里插入数据
INSERT INTO fruits (f_id, s_id, f_name, f_price)    VALUES('a1', 101,'apple',5.2),('b1',101,'blackberry', 10.2),('bs1',102,'orange', 11.2),('bs2',105,'melon',8.2),('t1',102,'banana', 10.3),('t2',102,'grape', 5.3),('o2',103,'coconut', 9.2),('c0',101,'cherry', 3.2),('a2',103, 'apricot',2.2),('l2',104,'lemon', 6.4),('b2',104,'berry', 7.6),('m1',106,'mango', 15.6),('m2',105,'xbabay', 2.6),('t4',107,'xbababa', 3.6),('m3',105,'xxtt', 11.6),('b5',107,'xxxx', 3.6);

使用EXPLAIN语句来分析一个查询语句

EXPLAIN SELECT * FROM fruits;
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | fruits | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)

对比查询中不使用索引和使用索引

以下命令是查询语句中不使用索引和使用索引的对比。

未使用索引时的查询情况

EXPLAIN SELECT * FROM fruits WHERE f_name='apple'; 
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | fruits | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   16 |    10.00 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

使用索引时的查询情况

创建索引并使用EXPLAIN 命令分析使用索引时的查询情况

CREATE INDEX index_name ON fruits(f_name); Query OK, 0 rows affected (0.04 sec)Records: 0  Duplicates: 0  Warnings: 0EXPLAIN SELECT * FROM fruits WHERE f_name='apple';  
+----+-------------+--------+------------+------+---------------+------------+---------+-------+------+----------+-----------------------+
| id | select_type | table  | partitions | type | possible_keys | key        | key_len | ref   | rows | filtered | Extra                 |
+----+-------------+--------+------------+------+---------------+------------+---------+-------+------+----------+-----------------------+
|  1 | SIMPLE      | fruits | NULL       | ref  | index_name    | index_name | 1020    | const |    1 |   100.00 | Using index condition |
+----+-------------+--------+------------+------+---------------+------------+---------+-------+------+----------+-----------------------+
1 row in set, 1 warning (0.01 sec)

LIKE关键字

查询语句中使用LIKE关键字,并且匹配的字符串中含有‘%’符,EXPLAIN语句执行如下:

分析"查询以x结尾的水果名字" 命令

EXPLAIN SELECT * FROM fruits WHERE f_name like '%x';
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | fruits | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   16 |    11.11 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

分析"查询以x开头的水果名字" 命令

EXPLAIN SELECT * FROM fruits WHERE f_name like 'x%';
+----+-------------+--------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
| id | select_type | table  | partitions | type  | possible_keys | key        | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+--------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | fruits | NULL       | range | index_name    | index_name | 1020    | NULL |    4 |   100.00 | Using index condition |
+----+-------------+--------+------------+-------+---------------+------------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.01 sec)

多列索引

在表fruitsf_id、f_price字段创建多列索引,验证多列索引的使用情况。

创建多列索引

CREATE INDEX index_id_price ON fruits(f_id, f_price);Query OK, 0 rows affected (0.03 sec)Records: 0  Duplicates: 0  Warnings: 0

验证多列索引的使用情况

EXPLAIN SELECT * FROM fruits WHERE f_id='l2';
+----+-------------+--------+------------+-------+------------------------+---------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type  | possible_keys          | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+--------+------------+-------+------------------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | fruits | NULL       | const | PRIMARY,index_id_price | PRIMARY | 40      | const |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+-------+------------------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)EXPLAIN SELECT * FROM fruits WHERE f_price=5.2;
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | fruits | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   16 |    10.00 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

or 关键字查询优化

查询语句使用OR关键字的情况

分析水果名字为apple或id号为101的情况

EXPLAIN SELECT * FROM fruits WHERE f_name='apple' or s_id=101 \G;
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: fruitspartitions: NULLtype: ALL
possible_keys: index_namekey: NULLkey_len: NULLref: NULLrows: 16filtered: 15.62Extra: Using where
1 row in set, 1 warning (0.00 sec)
ERROR:
No query specified

分析水果名字为apple或id号为l2的情况

EXPLAIN SELECT * FROM fruits WHERE f_name='apple' or f_id='l2' \G;
*************************** 1. row ***************************id: 1select_type: SIMPLEtable: fruitspartitions: NULLtype: index_merge
possible_keys: PRIMARY,index_name,index_id_pricekey: index_name,PRIMARYkey_len: 1020,40ref: NULLrows: 2filtered: 100.00Extra: Using union(index_name,PRIMARY); Using where
1 row in set, 1 warning (0.01 sec)ERROR:
No query specified

JOIN 命令查询

为了方便观察,建立会员表(members),主要用来存储会员登录认证信息。
以下命令会返回members表中的所有记录,并将每个members记录与members_detail表中对应的记录通过LEFT JOIN进行连接。

CREATE TABLE members (Id int(11) NOT NULL AUTO_INCREMENT,username varchar(255) DEFAULT NULL ,password varchar(255) DEFAULT NULL ,last_login_time datetime DEFAULT NULL ,last_login_ip varchar(255) DEFAULT NULL ,PRIMARY KEY (Id)
) ;CREATE TABLE members_detail (member_id int(11) NOT NULL DEFAULT 0,address varchar(255) DEFAULT NULL ,telephone varchar(16) DEFAULT NULL ,description text
) ;SELECT * FROM members LEFT JOIN members_detail ON members.id=members_detail.member_id;

members表和members_detail表数据

  • members在这里插入图片描述
  • members_detail在这里插入图片描述
  • 查询结果: 在这里插入图片描述

查询结果的几种情况

  • 一对一关系:

每个members记录对应一个members_detail记录,结果中包含所有members字段和对应的members_detail字段。

  • 无对应关系:

members记录在members_detail中没有对应记录时,members_detail字段为NULL。

  • 一对多关系:

members_detail中有多条对应记录时,members记录会重复显示,每条对应一个members_detail记录。

优化插入命令

新建会员信息表和会员组信息表

CREATE TABLE vip(Id int(11) NOT NULL AUTO_INCREMENT,username varchar(255) DEFAULT NULL,password varchar(255) DEFAULT NULL,groupId INT(11) DEFAULT 0,PRIMARY KEY (Id)
) ;CREATE TABLE vip_group (Id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,remark varchar(255) DEFAULT NULL,PRIMARY KEY (Id)
) ;CREATE TABLE temp_vip (Id int(11) NOT NULL AUTO_INCREMENT,user_name varchar(255) DEFAULT NULL,group_name varchar(255) DEFAULT NULL,group_remark varchar(255) DEFAULT NULL,PRIMARY KEY (Id)
);INSERT INTO temp_vip (user_name, group_name, group_remark) VALUES 
('lxj', 'lian', 'This is my remark');SELECT v.username,g.name,g.remark FROM vip as v ,vip_group as gWHERE v.groupId=g.Id; 

执行INSERT INTO命令后,temp_vip表中会插入一条新记录。
通过select语句查询的是获取vip表中每个用户的用户名,以及他们所属的组的名称和备注,前提是vip表的groupId与vip_group表的Id匹配。

ANALYZE TABLE 命令分析表

该命令用于分析 fruits 表的结构和统计信息,以优化查询性能。具体来说,ANALYZE TABLE 会更新表的统计信息,比如索引的使用情况、行数等,帮助 MySQL 查询优化器做出更好的决策。
使用ANALYZE TABLE来分析fruits表,执行的语句及结果如下:

ANALYZE TABLE fruits;
+------------+---------+----------+----------+
| Table      | Op      | Msg_type | Msg_text |
+------------+---------+----------+----------+
| lxj.fruits | analyze | status   | OK       |
+------------+---------+----------+----------+
1 row in set (0.01 sec)
  • Table: 被分析的表名。在这里是 lxj.fruits,其中 lxj 是数据库名,fruits 是表名。
  • Op: 操作类型。这里是 analyze,表示执行的是分析操作。
  • Msg_type: 消息类型。这里是 status,表示返回的是状态信息。
  • Msg_text: 消息文本。这里是 OK,表示分析操作成功完成。

本文有关Mysql数据库性能优化例题已经讲完了, 明天再见啦👋
主页:【练小杰的CSDN】😆
ℹ️欢迎各位在评论区踊跃讨论,积极提出问题,解决困惑!!!
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!

相关文章:

【Mysql】我在广州学Mysql 系列—— 性能优化相关例题

ℹ️大家好,我是练小杰,时间过得真快,还有2天,2025年2月份就结束了!!😆 本文是针对Mysql数据库中有关性能优化的相关示例,通过本文的学习可以深入了解性能优化的各类命令&#xff01…...

java23种设计模式-中介者模式

中介者模式(Mediator Pattern)学习笔记 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…...

鸿蒙next 点击穿透实现

点击穿透可以参考华为开发的保留文章,该章节只能在developer preview版本下查看 点击穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…...

OpenAPI Generator:API开发的瑞士军刀

一、工具介绍 OpenAPI Generator是基于OpenAPI规范(Swagger)的代码生成工具,支持50种编程语言的客户端/服务端代码生成。其核心价值在于: 自动化生成⇒减少重复劳动规范API开发流程 核心能力矩阵: 功能支持示例客户端SDK生成Java/Python/T…...

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠

摘要:纯电动商用车的工作环境存在路况复杂、工况恶劣等情况,导致整车电气设备的磨损速率加快,造成电气设备绝缘电阻持续下降,如不及时处理,可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发&#xff0…...

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况:本科就读于电科软院,24年2月开始了解考研,24年3月开始数学,9月决定考本院(开始全天候图书馆学习)并开始专业课学习,11月底开始政治学习,最后…...

2025面试Go真题第一场

前几天参加了一场面试,GoLang 后端工程师,他们直接给了我 10 道题,我留了一个截图。 在看答案之前,你可以先简单做一下,下面我会对每个题目做一个说明。 文章目录 1、golang map 是否并发安全?2、协程泄漏的原因可能是…...

【量化策略】趋势跟踪策略

【量化策略】趋势跟踪策略 🚀量化软件开通 🚀量化实战教程 技术背景与应用场景 在金融市场中,趋势跟踪策略是一种基于市场趋势进行交易的量化投资方法。该策略的核心思想是“顺势而为”,即当市场出现明显的上升或下降趋势时&a…...

leetcode 541. 反转字符串 II 简单

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符&…...

org.springframework.boot不存在的其中一个解决办法

最近做项目的时候发现问题,改了几次pom.xml文件之后突然发现项目中的注解全部爆红。 可以尝试点击左上角的循环小图标,同步所有maven项目。 建议顺便检查一下Project Structure中的SDK和Language Level是否对应,否则可能报类似:“…...

AI绘画软件Stable Diffusion详解教程(2):Windows系统本地化部署操作方法(专业版)

一、事前准备 1、一台配置不错的电脑,英伟达显卡,20系列起步,建议显存6G起步,安装win10或以上版本,我的显卡是40系列,16G显存,所以跑大部分的模型都比较快; 2、科学上网&#xff0…...

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL(结构化查询语言)中的四个重要类别,它们分别用于不同类型的数据库操作,下面为你简单明了地解释这四类语句: 1. DQL(数据查询语言,Data Query Langu…...

Linux中Shell运行原理和权限(下)(4)

文章目录 前言一、Shell的运行原理二、Linux当中的权限问题Linux权限的概念如何将普通用户添加到信任列表 三、Linux权限管理文件访问者的分类(人)文件类型和访问权限(事物属性)文件权限值的表示方法文件访问权限的相关设置方法如…...

LeetCode热题100- 字符串解码【JavaScript讲解】

古语有云:“事以密成,语以泄败”! 关于字符串解码: 题目:题解:js代码:代码中遇到的方法:repeat方法:为什么这里不用this.strstack.push(result)? 题目&#x…...

每日一题——LRU缓存机制的C语言实现详解

LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...

Leetcode3162:优质数对的总数 I

题目描述&#xff1a; 给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以除尽 nums2[j] * k&#xff0c;则称数对 (i, j) 为 优质数对&#xff08;0 < i < n - 1, 0 < j < m - 1&#xff09;。 返回 优…...

docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结

官方网站 官方网址&#xff1a;etcd 二进制包下载&#xff1a;Install | etcd GitHub社区项目&#xff1a;etcd-io GitHub GitHub社区项目版本历史&#xff1a;Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…...

Apache SeaTunnel 构建实时数据同步管道(最新版)

文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member&#xff0c;Apache SkyWalking Committer&#xff0c;多年平台研发经验&#xff0c;目前专注于数据集成领域。 导读 在当今数字化快速发展的时代&#xff0c;数据已然成为企业决策…...

递归、搜索与回溯第二讲:二叉树中的深搜 穷举vs暴搜vs深搜vs回溯vs剪枝

递归、搜索与回溯第二讲&#xff1a;二叉树中的深搜 && 穷举vs暴搜vs深搜vs回溯vs剪枝 1.计算布尔二叉树的值2.求根节点到叶结点数字之和3.二叉树剪枝4.验证二叉搜索树5.二叉搜索树中第K小的元素6.二叉树的所有路径7.全排列8.子集 1.计算布尔二叉树的值 2.求根节点到叶…...

Hbase分布式——储存机制

说明&#xff1a; 客户端调用&#xff0c;到达zk。然后到大HMaster&#xff08;主节点可以有多个但是只有和active在一起的才有效。&#xff09;。然后找到一个HRegionServer&#xff08;从节点可以有多个&#xff09;去做保存操作。 每一个HRegionServer上管理着表的HRegion…...

专业视频对比神器:用video-compare轻松解决你的视频质量难题

专业视频对比神器&#xff1a;用video-compare轻松解决你的视频质量难题 【免费下载链接】video-compare Split screen video comparison tool using FFmpeg and SDL2 项目地址: https://gitcode.com/gh_mirrors/vi/video-compare 你是否曾经需要比较两个视频的画质差异…...

新手避坑指南:超声波探伤仪A扫波形图到底怎么看?从杂波识别到缺陷定级的实战解析

新手避坑指南&#xff1a;超声波探伤仪A扫波形图到底怎么看&#xff1f;从杂波识别到缺陷定级的实战解析 第一次面对超声波探伤仪屏幕上跳动的波形时&#xff0c;那种茫然感我至今记忆犹新。屏幕上那些高低起伏的尖峰就像一道难以破解的密码&#xff0c;让人无从下手。作为过来…...

阿克曼公式在控制系统设计中的实战应用

1. 阿克曼公式&#xff1a;控制系统设计的数学魔法 第一次听说阿克曼公式时&#xff0c;我正被一个倒立摆控制系统折磨得焦头烂额。当时系统总是出现剧烈振荡&#xff0c;导师只说了一句"试试用阿克曼公式算反馈增益"&#xff0c;却让我在图书馆泡了整整三天。现在回…...

mysql数据库占用空间优化_MyISAM与InnoDB存储结构差异

InnoDB 删除数据不释放磁盘空间&#xff0c;因其仅标记记录为可复用&#xff0c;不自动归还页内空闲空间给操作系统&#xff1b;必须通过 ALTER TABLE 或 OPTIMIZE TABLE 重建表才能真正收缩文件。为什么删了数据&#xff0c;磁盘空间却不释放&#xff1f;这是 InnoDB 表最常被…...

day25-数据结构力扣

134. 加油站 题目链接134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 思路 虽然这个题看起来有点抽象 但是你仔细看一下他的示例&#xff0c;其实能明白 设每一站的净油量&#xff1a;diff[i] gas[i] - cost[i] 总判断如果所有 diff 加起来 < 0 → 总油不够跑一…...

SecGPT-14B入门教程:网络安全工程师必学的14B专用大模型调用与结果解读方法

SecGPT-14B入门教程&#xff1a;网络安全工程师必学的14B专用大模型调用与结果解读方法 1. 引言 如果你是网络安全工程师、渗透测试人员&#xff0c;或者对安全分析感兴趣&#xff0c;那你一定遇到过这样的场景&#xff1a;面对海量的日志&#xff0c;需要快速定位攻击线索&a…...

放射科医生正在被替代?不,他们正用多模态大模型将报告生成效率提升4.8倍,附内部Prompt工程模板

第一章&#xff1a;多模态大模型在医疗中的应用 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型正以前所未有的能力融合医学影像、电子病历、基因序列与临床文本&#xff0c;推动诊断精度、治疗规划与患者随访的范式升级。这类模型不再局限于单一数据类型&#xf…...

三维地理可视化:地形渲染与建筑物模型展示

三维地理可视化&#xff1a;地形渲染与建筑物模型展示 在数字时代&#xff0c;三维地理可视化技术正逐渐成为城市规划、灾害模拟、旅游开发等领域的重要工具。通过高精度地形渲染与建筑物模型展示&#xff0c;人们能够以更直观的方式理解复杂的地理空间信息。无论是虚拟城市漫…...

思源宋体完整使用指南:7款免费中文宋体字体终极教程

思源宋体完整使用指南&#xff1a;7款免费中文宋体字体终极教程 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版寻找高质量且完全免费的字体吗&#xff1f;思源宋体简体…...

AVPro Video插件避坑指南:解决拖动进度条杂音与NaN问题

AVPro Video插件实战&#xff1a;彻底解决进度条杂音与NaN显示问题 第一次在Unity项目里集成AVPro Video插件时&#xff0c;那个突如其来的"刺啦"杂音差点让我摔了耳机——每次拖动进度条都像用指甲刮黑板。更诡异的是Slider突然变成的"NaN"提示&#xff0…...