mysql | 查询数据的过程|优化-->索引 |存储引擎

news2024/10/3 4:36:46

查询的过程
首先确认mysql 服务器是否启动 systemctl mysqld status
登录连接 mysql -h i p − u ip -u ipuuser -p (-h 指定服务器ip -u 指定用户名 -p 指定密码)
mysql 数据包 经过抓包分析(mysql包其实就是基于tcp协议 3306端口) 传输采用mysql 协议,数据也是加密了的

所以这里也是先有三次握手、然后执行sql 再是四次挥手
上面的是短连接,下面就来讲一下长连接
三次握手
执行sql
执行sql
执行sql
……
四次挥手

当连接上了,可以查看有多少个客户端已经连接 show processlist;
可以查看 客户端最大连接数 show variables like ‘max_connections’;
连接的客户端状态有的是sleep、有的是query
可以查看 最长空闲连接时间 show variables like ‘wait_timeout’;
当然也可以手动断开空闲连接, kill connection +id;

接着查询缓存,注意mysql8.0以前的存储引擎采用的是innodb,缓存采用的是buffer pool
当要查询的结果,缓存中匹配上了,就直接返回结果

注意,budder pool 中采用的是key–value 形式进行缓存
但是当要查询的的表有更新操作,那么这个表的查询缓存就会被清空。
所以,这样一个场景,混存中有上一次查询的记录,但是又来了一个对这张表的另一个更改操作,导致这张表中的缓存全都清空,这时候再来一次查询就要从磁盘中查找了。

接着进行的是解析
解析,会根据关键词拆分,把语句拆成一个b+树
在这里插入图片描述
需要注意的是,sql 语句的语法检测,不是在这部份进行的,而是在下面的部份
执行sql
sql执行分为三步
预处理阶段(这个阶段会进行语法检测)、
优化阶段(比如有多个索引方式,优化器会将sql的方案确定下来,可以使用 explain + 执行的语句;
key 展示的就是用哪个索引。
执行阶段,执行sql语句。

讲一下,索引
索引的结构都有哪几种:
哈希索引:把索引当成key 然后去查找,速度很快,但是一个键只能对应一个值无法像树那样散列的分布
B+树:多路平衡二叉树,每个节点可以包含多个关键字和指向子节点的指针,内部节点不存储数据,只存储索引信息和指向子节点的指针,叶子节点有序(关键字都是有序排列在列子节点中,叶子节点之间通过指针相连形成链表、由于是高度平衡,所以查询的时间复杂度趋于logn

再讲讲索引的类型
普通索引,在建表的时候添加 index idex_name (name) -----解释:idex_name 为索引名、name 为字段名
或者在建完表以后,create index idex_name on student(name); -----解释: student 为表名 name 是创建该字段为索引
删除索引
srop index idex_name on student;
除了普通索引,还有主键索引,注意表中的主键默认就是采用了主键索引,换句话说,这个操作是多余的?
还有组合索引,组合索引要求组合的字段不为null,而且组合的结果必须唯一,注意组合索引还支持最左前缀原则,什么意思呢,就是当你创建了组合索引idex_name_student_id(name student_id),然后而是采用 name 去筛选,默认使用的就是组合索引idex_name_student_id,如果用student_id 去筛选,不会用组合索引。
create index idex_name_student_id on student(name, student_id);
同样执行的时候 最前面添加 explain 去查看这条语句执行的规则
当然还有 全文索引
讲了索引,再继续讲执行语句
在innodb 索引引擎中,(5.7—8)? (5.7之前是MyISAM ?)
因为innodb 是支持事务的,特点就是原子性,要么不错,要做就成功
执行sql,在buffer poll 缓存中找,如果没有便从磁盘中读取,这个io开销很大的,然后这个时候会会有undo日志工作,用于记录更新当前的sql,方便回滚操作。

如果是执行更改 innodb 会在 buffer pool 执行 然后将 日志写入Redo log buffer 中,再将日志刷入磁盘redo磁盘文件

在这里插入图片描述

感觉后面的部份还是讲的有点含糊
待加强!!!!!

参考1
参考2
参考3
参考4–更新一条sql

三种存储引擎的区别
参考5

myisam (5.1以前的版本,上面说5.7 修正一下)
该存储引擎保存了单独的索引文件.myi 而且它的索引是直接定位到OFFSET的,注意innodb 没有单独的物理存储索引文件,且innodb索引寻址是先定位到块数据,再定位到行数据,所以前者的索引速度快于后者(innodb)但是它不支持事务、不支持外键,所以适合场景:读多写少,对完整性要求不高的场景。
innodb
支持事务、支持外键、支持崩溃修复和自增列,对业务的完整性要求高。对读写效率较差,占用数据空间较大
在写入的时候也讲过undo、buffer pool
比如张三给李四转钱,这个事务要求表中张三的金额减少,李四金额增加,如果失败,则两个人的存款余额不变,如果转账成功,张三减少的数量就是李四增加的数量。保证了事务的完整性。

因为存储引擎的设置粒度是表级别,也就是说可以在每张表中设置不同的存储引擎。
查看表的时候,就可以看到

show table biao1;

设置biao1 的存储引擎
create table t1 engine = INNODB;
或者选择 MyISAM、MEMORY

在这里插入图片描述

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

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

相关文章

【探索C++容器:set和map的使用】

[本节目标] 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 1. 关联式容器 在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C11)等,这些容器统称为序列式容器,因为其底层为…

【Tauri】(4):整合Tauri和actix-web做本地大模型应用开发,可以实现session 登陆接口,完成页面展示,进入聊天界面

1,视频地址 https://www.bilibili.com/video/BV1GJ4m1Y7Aj/ 【Tauri】(4):整合Tauri和actix-web做本地大模型应用开发,可以实现session 登陆接口,完成页面展示,进入聊天界面 使用国内代理进行加…

农场管理小程序|基于微信小程序的农场管理系统设计与实现(源码+数据库+文档)

农场管理小程序目录 目录 基于微信小程序的农场管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、农场信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 五、核心代码 七、最新计算机毕设选题推荐 八、源码获取&#x…

族群争霸休闲养成小游戏

​游戏概述: 在一个由自然力量支配的幻想世界中,狼族与羊族的战争永无止境。 人族在两者之间寻求和平,建立起坚固的城墙,同时捕捉狼与羊来增强自身实力。 神族则在幕后观察,偶尔以神技介入战场,影响战局…

如何通过隐藏服务器真实IP来防御DDOS攻击

我们知道,服务器对外提供服务,基本上都是放置在公网上的。所以说服务器放置在公网上会面临很多攻击,如果不做好必要的防护措施,服务器被人攻击只是时间上的问题。 而我们面临的众多攻击中,DDoS攻击是最常见同时也是影响…

CSS顶部与JS后写:网页渲染的奥秘

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【linux】01 :虚拟机,Linux系统,远程连接Linux系统

导入:常见操作系统有哪些? PC端:Windows,Linux,MacOS 移动端:Android、IOS、鸿蒙系统 一、Linux 系统的组成 由Linux 系统内核和系统级应用程序两部分组成。 内核提供系统最核心的功能,如:调度 CPU 、调度…

Android Studio在导入项目后编译出现java版本错误解决方法

打开新项目时出现一下错误: Unsupported Java,Your build is currently configured to use Java 17.0.9 and Gradle 5.6.4. 这说明使用的java版本过高,而 gradle5.6.4对应的是java8,最新安装的编译器java版本是17 解决方法是为项…

C语言————字符函数与字符串函数

在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,如追加,拷贝,替换等等接下来我们就学习⼀下这些函数,并且自实现。 gets 这个指令大家…

IntelliJ IDEA 2020.2.4试用方法

打开idea,准备好ide-eval-resetter压缩包。 将准备好的压缩包拖入idea中 选中弹窗中的自动重置选项,并点击重置 查看免费试用时长

【Docker安装教程】Docker安装Redis详解

安装Redis前我们必须要保证Docker运行OK,如何安装Docker参考《CentOS 7 上的 Docker 安装与配置》 步骤 1: 拉取 Redis 镜像 首先,确保你已经安装了 Docker。然后,使用以下命令拉取最新的 Redis 镜像: docker pull redis](http…

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数---分类性能评估的利器

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合…

《互联网的世界》第五讲-信任和安全(第一趴:物理世界的非对称加密装置)

信任和安全的话题过于庞大,涉及很多数学知识,直接涉及 “正事” 反而不利于理解问题的本质,因此需要先讲一个前置作为 part 1。 part 1 主要描述物理世界的信任和安全,千万不要觉得数字世界是脱离物理世界的另一天堂,…

【C语言】字符指针

在指针的类型中我们知道有一种指针类型为字符指针char* 一般使用: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有一种使用方式,如下: int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

基于决策树实现葡萄酒分类

基于决策树实现葡萄酒分类 将葡萄酒数据集拆分成训练集和测试集,搭建tree_1和tree_2两个决策树模型,tree_1使用信息增益作为特征选择指标,B树使用基尼指数作为特征选择指标,各自对训练集进行训练,然后分别对训练集和测…

基于Java的在线课程教学系统(Vue.js+SpringBoot)

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

企业AI转型之路:策略与实践

目录 前言1 试点项目:积累AI经验1.1 选择有实际价值的项目1.2 创新氛围的激发1.3 员工对新技术的接受度提升 2 建立高效的内部AI团队2.1 团队独立性与高层直报2.2 初期资金支持与资源整合 3 提供全面的AI培训计划3.1 针对不同层次的培训3.2 多样化培训形式3.3 内部人…

【Linux】线程同步与生产消费者问题

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:题目解析 🌎推荐文章:【LeetCode】winter vacation training 目录 👉🏻CP问题👉🏻互斥…

Linux:kubernetes(k8s)prestop事件的使用(10)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据,用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

Day34-Linux网络管理4

Day34-Linux网络管理4 1. IP地址分类与子网划分基础1.1 什么是IP地址1.2 十进制与二进制的转换1.3 IP地址的分类1.4 私网地址和局域网地址 2. 通信类型3. 子网划分讲解3.1 为什么要划分子网?3.2 什么是子网划分?3.3 子网划分的作用?3.4 子网划…