【MySQL进阶】 存储引擎 索引
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。
🎉🎉个人主页🎉🎉 : 南瓜籽的主页
✨✨座右铭✨✨ : 坚持到底,决不放弃,是成功的保证,只要你不放弃,你就有机会,只要放弃的人,他肯定是不会成功的人。
✨✨存储引擎✨✨
🍉🍉存储引擎介绍🍉🍉
存储引擎层,
存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以根据自己的需要,来选取合适的存储引擎。数据库中的索引是在存储引擎层实现的。
🍉🍉存储引擎特点🍉🍉
1、 InnoDB
1). 介绍
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的MySQL 存储引擎。
2). 特点
DML操作遵循ACID模型,支持事务;行级锁,提高并发访问性能;支持外键FOREIGN KEY约束,保证数据的完整性和正确性;
3). 文件
xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm-早期的 、sdi-新版的)、数据和索引。
2、MyISAM
1). 介绍
MyISAM是MySQL早期的默认存储引擎。
2). 特点
不支持事务,不支持外键,支持表锁,不支持行锁,访问速度快
3). 文件
xxx.sdi:存储表结构信息
xxx.MYD: 存储数据
xxx.MYI: 存储索引
3、Memory
1). 介绍
Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为
临时表或缓存使用。
2). 特点
内存存放
hash索引(默认)
3).文件
xxx.sdi:存储表结构信息
🍉🍉存储引擎区别与特点🍉🍉
🍉🍉存储引擎选择🍉🍉
InnoDB: 是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要
求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操
作,那么InnoDB存储引擎是比较合适的选择。
MyISAM: 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完
整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。
MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是
对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。
✨✨索引✨✨
🍎🍎索引介绍🍎🍎
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
在无索引情况下,在我们执行查询语句的时候默认会全表扫描,性能很低
🍎🍎索引特点🍎🍎
🍎🍎索引结构🍎🍎
MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:
下面是不同存储引擎对索引结构的支持情况:
注: 我们平常说的索引,默认是B+树结构的索引。
🍎🍎索引分类🍎🍎
在MySQL数据库,将索引的具体类型主要分为以下几类:
主键索引、唯一索引、常规索引、全文索引。
聚集索引和二级索引
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
聚集索引选取规则
- 如果存在主键,主键索引就是聚集索引。
- 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
- 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索
引。
🍎🍎索引语法🍎🍎
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 ; 1
🍎🍎索引使用🍎🍎
1. 最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。
注: 最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段(即是
第一个字段)必须存在,与我们编写SQL时,条件编写的先后顺序无关。
2. 范围查询
联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效,所以我们要尽量使用
>=或者<=才不会出现索引失效的情况。
❗❗索引失效情况❗❗
注:
等值匹配查询时,索引生效
例子:
explain select * from tb_user where name= '张三';
explain关键字我们在后面会有讲解😊
1. 在
索引列上进行运算(包括函数运算操作) 操作, 索引将失效。
例: explain select * from tb_user where substring(phone,10,2) = ‘15’;
2.
字符串类型字段使用时,不加引号,索引将失效。如果字符串不加单引号,对于查询结果,没什么影响,但是数据库存在隐式类型转换,索引将失效。
例: explain select * from tb_user where phone = ‘17799990015’; –索引生效
explain select * from tb_user where phone = 17799990015; –索引不生效
3. 如果仅仅是
尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
例: explain select * from tb_user where name like ‘张%’;
4. 用
or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
例: explain select * from tb_user where id = 10 or age = 23; – age没有建立索引,此时索引失效
5. 如果
MySQL评估使用索引比全表更慢,则不使用索引。
例: explain select * from tb_user where profession = ‘软件工程’;
tips: – 数据库中的大部分专业都是计算机科学与技术,此时MySQL会进行评估,评估后会发现不走索引的情况下会更快,此时索引失效。
🍎🍎SQL提示🍎🍎
SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
1. use index 建议MySQL使用哪一个索引完成此次查询(仅仅是建议,mysql内部还会再次进行评估)。
explain select * from tb_user use index(idx_user_pro) where profession = '软件工
程';
2. ignore index : 忽略指定的索引
explain select * from tb_user ignore index(idx_user_pro) where profession = '软件工
程';
3. force index : 强制使用索引
explain select * from tb_user force index(idx_user_pro) where profession = '软件工
程';
🍎🍎覆盖索引🍎🍎
尽量使用覆盖索引,减少select *。 那么什么是覆盖索引呢? 覆盖索引是指 查询使用了索引,并
且需要返回的列,在该索引中已经全部能够找到 。
通过执行计划我们可以发现,主要的差异在Extra列中

🍎🍎前缀索引🍎🍎
当字段类型为
字符串(varchar,text,longtext等)时,有时候需要索引很长的字符串,这会让
索引变得很大,查询时,浪费大量的磁盘IO, 影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。
语法:
create index idx_xxxx on table_name(column(n)) ; -- n为索引长度
前缀长度:
-- 可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,
-- 索引选择性越高则查询效率越高, 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
select count(distinct email) / count(*) from tb_user ;
select count(distinct substring(email,1,5)) / count(*) from tb_user ;
前缀索引的查询流程:
🍎🍎单列索引与联合索引🍎🍎
单列索引:即一个索引只包含单个列。
联合索引:即一个索引包含了多个列。
在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,
而非单列索引。
🍎🍎索引设计原则 🍎🍎
1、 针对于数据量较大,且查询比较频繁的表建立索引。
2、 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
3、 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
4、 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
5、 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
6、 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
create unique index idx_user_phone_name on tb_user(phone,name); 1
7、 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。
✨✨SQL性能分析✨✨
🍒🍒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: 更新次数
通过上述指令,我们可以查看到当前数据库到底是以查询为主,还是以增删改为主,从而为数据
库优化提供参考依据。 如果是以增删改为主,我们可以考虑不对其进行索引的优化。 如果是以
查询为主,那么就要考虑对数据库的索引进行优化了。
🍒🍒慢查询日志🍒🍒
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有
SQL语句的日志。
MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量SLOW_QUERY_LOG。

Linux中: 如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2
配置完成之后,通过以下命令重启MySQL服务器进行测试,重启之后,慢查询日志已经打开了
systemctl restart mysqld
慢查询日志的缺点:
我发现,在慢查询日志中,只会记录执行时间大于等于 2s 的SQL,其他执行较快的SQL是不会进行记录的。
🍒🍒profile🍒🍒
show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling
参数,能够看到当前MySQL是否支持profile操作:
– Windows中显示是 YES 或者是 NO

– Linux中显示 是 1 或者 0
我们可以通过set 语句 在 session / global 级别开启 profiling:
Linux 中:
SET PROFILING = 1;
Windows 中:
SET PROFILING = TRUE;
执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时:
-- 查看每一条SQL的耗时基本情况
show profiles;
-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;
🍒🍒explain🍒🍒
EXPLAIN或者DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行
过程中表如何连接和连接的顺序。
语法:
-- 直接在select语句之前加上关键字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;

各个字段的含义:
相关文章:
【MySQL进阶】 存储引擎 索引
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…...
5 款最好的免费 SSD 数据恢复软件
SSD(固态硬盘)提供比传统硬盘更快的读/写速度,使启动、软件加载和游戏启动更快。因此,在我们选择存储设备时,它是一个极好的选择。但是,它仍然存在数据丢失的风险。假设您是受害者之一,正在寻找…...
MyBatis案例 | 使用映射配置文件实现CRUD操作——删除数据
本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址:🔥JavaWeb Java入门篇: 🔥Java基础学习篇 Java进阶学习篇&…...
CSDN 编程竞赛二十八期题解
竞赛总览 CSDN 编程竞赛二十八期:比赛详情 (csdn.net) 本期竞赛的题目都很简单,但是非常考验读题和编码速度。这一次没有遇到bug,竞赛体验较好。 竞赛题解 题目1、小Q的鲜榨柠檬汁 团建活动是大家所想要的。小Q给大家准备了鲜橙汁。现在…...
DML数据操纵语言
DML数据操纵语言 目录概述一、插入语句(一)方式一(二)方式二:(三)两种方式的比较二、修改语句三、删除语句概述方式一:delete方式二:truncate语句 【清空语句】delete VS truncate 【面试题!!!】概述 数据…...
【Hello Linux】Linux工具介绍 (gcc/g++ gdb)
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具gcc/g 以及gbd Linux工具介绍gcc / ggcc / g的作用为什么语言要经过这四步才能变为可执行指令gcc / g语法预处理编…...
TeamFiltration:一款针对O365 AAD账号安全的测试框架
关于TeamFiltration TeamFiltration是一款针对O365 AAD账号安全的跨平台安全测试框架,在该工具的帮助下,广大研究人员可以轻松对O365 AAD账号进行枚举、喷射、过滤和后门植入等操作。TeamFiltering与CrackMapExec非常相似,它可以创建并维护一…...
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧😎前言🙌1. 什么是bug?🙌2. 调试是什么?有多重要?🙌2.1 调试是什么?2.2 调试的基本步骤…...
数据结构与算法:7种必须会的排序以及3种非基于比较排序
1.什么是排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序…...
数据库用户数
Oracle的用户数 oracle软件内部并没对用户数做限制,买5个用户数,指你买了5个user licences,从法律上只能连5个session,超过5个的连接都是非法的。oracle不给你技术上的限制,可是给你法律上的限制。 一般来讲…...
nginx如何用html显示多个图片并加入播放链接
需求背景通过nginx来做个点播服务,ffmpeg截取视频中的某一帧作为视频的封面,前端页面展示这个封面,,并链接到对应的视频播放链接,加载播放器进行播放简单介绍一下ffmpeg截取视频中的某一帧的方式截取视频的第一帧&…...
【蓝桥杯集训·每日一题】Acwing 3729. 改变数组元素
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴一维差分区间合并一、题目 1、原题链接 3729. 改变数组元素 2、题目描述 给定一个空数组 V 和一个整数数组 a1,a2,…,an。 现在要对数组 V 进行 n 次操作。 第 i 次操作的…...
springmvc执行流程
文章目录前言一、springMVC请求执行流程二、组件说明以下组件通常使用框架提供实现:总结前言 本篇文章是对springmvc的补充 接上篇文章springmvc入门https://blog.csdn.net/l_zl2021/article/details/127120873 一、springMVC请求执行流程 1.用户发送请求至前端控制…...
SpringMVC(2)
一)接受到JSON格式的数据:使用RequestBody来进行接收 ResponseBody表示的是返回一个非页面的数据 RequestBody表示的是后端要接受JSON格式的数据 一)接收单个格式的JSON格式的数据,我们使用一个对象来进行接收 1)我们之前接受GET请求中的queryString中的参数的时候&…...
Jackson序列化json时null转成空串或空对象
在项目中可能会遇到需要将null转"",可以通过以下方法解决。一:添加JacksonConfig 配置import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.Objec…...
如何将Python的上级目录的文件导入?【from.import】
假如有如下目录: -python ----file1 ---------file1_1 ------------------pfile1_1.py ---------pfile1.py ----file2 ---------pfile2.py ----pfile.py ----data.py 在pfile1_1.py中想要将pfile.py 导入怎么办? 首先将其上级目录添加到系统目…...
Java实现碧蓝航线连续作战
目录一.实现功能二.主要思路三.代码实现四.用exe4j生成.exe程序五.最终效果六.代码开源一.实现功能 主线图作战结束到结算页自动点击再次前往 二.主要思路 判断是否进入了结算界面:记录结算界面某个像素点的RGB值,每隔3秒对这个像素点进行比对 移动鼠标…...
Docker笔记
文章目录1.docker为什么会出现2.docker是什么3.传统虚拟机和容器的对比3.1虚拟机3.2容器虚拟化技术3.3两者对比3.4为什么Docker会比VM虚拟机快?4.docker能干嘛6.docker的应用场景7.docker三要素一:镜像(Image)二:容器&…...
情人节使用AI TOOL来创建一个甜言蜜语的女伴
一、首先使用chatgpt生成一段情侣间的对话,需要反复几次,达到满意的程度,然后将女方的话归在一起。 这是一个情侣私下谈话的场景,女方表示对男朋友精心准备的情人节安排和礼物表示很满意 二、 打开网站:https://lexic…...
G-GhostNet(IJCV 2022)原理与代码解析
paper:GhostNets on Heterogeneous Devices via Cheap Operationscode:https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/g_ghost_pytorch/g_ghost_regnet.py前言本文提出了两种轻量网路,用于CPU端的C-GhostNet和用于GPU端…...
通过curl命令直接测试Taotoken大模型API的接入与响应
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令直接测试Taotoken大模型API的接入与响应 基础教程类,为需要在无SDK环境或快速排错的开发者,提…...
Claw Companion:OpenClaw网关的移动控制中心设计与实战
1. 项目概述:Claw Companion,一个为OpenClaw网关打造的移动控制中心如果你正在寻找一个能让你在手机上轻松管理OpenClaw网关的工具,那么Claw Companion for Android(以下简称Claw Companion)绝对值得你花时间深入了解。…...
Python逆向工程库Gemini-API:解锁Google Gemini多模态与深度研究全功能
1. 项目概述与核心价值如果你正在寻找一个能让你在Python项目中无缝接入Google Gemini(就是那个以前叫Bard的AI)全部能力的库,并且希望它能像官方API一样优雅易用,同时又能绕过一些官方限制,直接使用网页版的高级功能&…...
从JPG+JGW到GeoTIFF:手把手教你用QGIS完成坐标转换与格式升级
从JPGJGW到GeoTIFF:QGIS实战坐标转换与格式升级指南 当你手头只有一张JPG格式的规划图纸和对应的JGW坐标文件,却需要在GIS分析中使用这些数据时,格式转换与坐标系统处理就成为关键步骤。本文将带你用开源神器QGIS完成从基础配准到高级格式转换…...
2025年九大网盘直链下载助手:免费高效的文件下载终极方案
2025年九大网盘直链下载助手:免费高效的文件下载终极方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...
5分钟掌握SpliceAI:用深度学习预测基因剪接变异的革命性工具
5分钟掌握SpliceAI:用深度学习预测基因剪接变异的革命性工具 【免费下载链接】SpliceAI A deep learning-based tool to identify splice variants 项目地址: https://gitcode.com/gh_mirrors/sp/SpliceAI 想要快速识别可能导致遗传疾病的基因变异吗…...
深度学习在肺结节CT影像分析中的应用:从检测、分割到分类
1. 项目概述:从影像到洞察的智能跃迁在医学影像领域,尤其是胸部CT阅片,肺结节的检测、分割与分类一直是临床诊断的核心与难点。一个经验丰富的放射科医生每天需要面对数百甚至上千幅CT图像,在浩如烟海的二维切片中,精准…...
互联网档案馆瑞士分部成立,拓展全球知识保护使命
互联网档案馆博客导航互联网档案馆博客包含多个导航链接,有 archive.org、博客、公告、关于、活动、开发者、捐赠等。互联网档案馆瑞士分部成立30 年前,布鲁斯特卡勒创立互联网档案馆,目标是“让所有人都能普遍获取所有知识”。如今ÿ…...
如何快速配置Scroll Reverser:面向新手的macOS滚动方向管理完整指南
如何快速配置Scroll Reverser:面向新手的macOS滚动方向管理完整指南 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否经常在MacBook触控板和鼠标之间切换&#…...
实测 Taotoken 在不同时段的 API 响应延迟与稳定性观感
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 实测 Taotoken 在不同时段的 API 响应延迟与稳定性观感 在将大模型能力集成到应用中的过程中,API 的响应延迟与稳定性是…...







