MySQL执行原理、存储引擎、索引模型简介

1.sql的执行原理

  • Connectors

    连接、支持多种协议,各种语言

  • Management service

    系统管理和控制工具,例如:备份、集群副本管理等

  • pool

    连接池

  • sql interfaces

    sql接口-接收命令返回结果

  • parser

    分析解析器:验证

  • optimizer

    优化器:优化sql执行效率

  • cache and buffer

    查询缓存

  • storage engines

    存储引擎:可插拔

  • file system

    文件系统

1.1mysql的基本架构和执行原理

两个部分:server层与存储引擎层

  • 连接器

    建立客户端和服务器连接、权限获取、维持管理连接

    #mysql -u$user -p$password
    mysql -uroot -p

    mysql本质为客户端连接工具,tcp握手成功,需要进行身份认证

    查询连接状态:

    短链接:执行少数几次查询就会断开,浪费大量资源

    长连接:连接成功后,长时间保持连接,wait_timeout默认连接时间

    查看默认连接时长

    show variables like 'wait_timeout';

    查当前连接时长

    show processlist;

    长连接驻留内存解决方法

    1、固定时间自动重新连接

    2、mysql_reset_connection 重置连接

  • 查询缓存

    query_cache_type:查询缓存类型

    show variables like 'query_cache_type';

    如果需要使用,需要设置为DEMAND(按需)

    缓存失效

    1、增删改操作导致缓存失效

    mysql8.0已将缓存移除

  • 分析器

    词法分析:检测每个单词的含义

    语法分析:对sql语法规则校验,是否满足mysql语法规范

  • 优化器

    选择最优解

    索引选择、执行顺序可能影响执行效率,优化器进行最优选择

    select * from t1 inner join t2 using(ID) where t1.c = 10 and t2.d = 20;

    如下两个执行顺序:

    1、先找到t1.c=10的所有记录和整个t2表关联,最后筛选t2.d=20的记录

    2、先找到t2.d=20的所有记录和整个t1表关联,最后筛选t1.c=10的记录

  • 执行器

    select * from emp where no = 10;

    1、表操作权限验证

    2、innodb存储引擎查询第一行,查看no=10则写道结果集,如果不等于10则跳过整张表查询完毕

    3、将结果返回给客户端

2.存储引擎

2.1存储引擎简介

数据库存储引擎是数据库底层软件组织,数据库管理管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。MySQL的核心就是存储引擎。

mysql底层设计采用可插拔式的存储引擎,用户根据需求,选择或自定义存储引擎

mysql5.5之后默认存储引擎为innodb

1、查看mysql可支持的存储引擎

show engines;

2、各种存储引擎对比

  • innoDB

    mysql5.5默认的存储引擎,事务型数据库。

    1.数据底层的存储:数据表文件-->>.frm(表结构)文件和.ibd(数据和索引)文件

    2.事务:支持热备份,对数据完整性要求较高,mysql是较好选择

    3.锁的粒度:采用MVVC(多版本并发)支持高并发操作,支持四种事务隔离级别,行锁

    4.存储特点:采用聚簇索引

    5.适用场景:更新和查询比较频繁,并发操作、要求事务,支持外键约束

    #查看mysql数据存储位置
    show variables like '%data%';
  • MyISAM

    1.存储形式:数据表文件-->>.frm(表结构)和.MYD和.MYI(数据和索引分离)

    2.事务:不支持

    3.存储特点:非聚簇

    4.其他:全文检索,压缩,延迟更新索引等

    5.适用场景:count计算、查询

  • Memory

    1.数据保存在内存中,增删改查效率高,但是不能持久化

    2.不支持事务、表级锁

2.2如何设置存储引擎

#默认mysql的配置文件路径
修改存储引擎:
default_storage_engine=INNODB#创建表时修改存储引擎:
create table tname(col) engine = INNODB;#查看某张表的基本信息
#命令行模式
show tables status from dbname where name = tname \G;

3.索引

3.1索引简介

索引:为了提升查询效率创建数据机构

3.2常见的索引模型

  • 哈希表

    键-值方式存储数据结构。使用key进行hash计算获取到一个值(位置),去该位置寻找数据(值)
    数组,hash函数 适用场景:
    等值查询
    不适用场景:
    范围查询,存储是无序的哈希碰撞(哈希冲突)
    解决方法:
    1、链表(拉链法)
    即多个不同的key值经过哈希函数的计算后,会出现同一个值的情况。处理方法是拉出一个链表。
    
  • 有序数组

整个数组中排列的是有序的,查找非常方便,可以使用二分法
适用场景:等值查询、范围查询,主要是用与存储静态的数据或者不需要经常变更的数据不适用场景:
进行数据的插入与删除,因为每次插入或删除一个数值时都需要移动后面的数据消耗会比较大

  • 二叉搜索树

        二叉查找树(Binary Search Tree)(又称二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。

二叉树的特点:

1、有链表的快速插入与删除操作的特点,

2、有数组快速查找的优势

3、树最影响效率的是树的深度

二叉树存在的问题:

1、在操作数据时如何平衡二叉树,因为在插入随机的情况下有可能其中不同分支的树深度不同导致查询消耗增加

  • B树

B树的定义:

B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树

每个节点都存有索引和数据,也就是对应的key和value。索引是指向子节点的指针,数据是关键字;
每个节点最多有m-1个关键字(可以存有的键值对),即每个节点至多含有m棵子树;
若根节点不是终端节点,则至少有两棵子树,即最少可以只有1个关键字;
除根节点外的所有非叶节点至少有上限值(m/2)棵子树,即上限值(m/2)-1个关键字;
每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。

B树优点:

1、B树在每一个节点上都存储数据,因此在访问离根节点近的数据时速度会更快

2、继承二叉树优点

  • B+树

B+树特点

B+树结构只在叶子节点才存储真正的数据,其他子节点存储的是数据索引,假设每个子节点大小16KB,则B+树相比B树能存储更多的关键字,每次读入内存的关键字也会更多,这样B+树从磁盘读取数据损耗更低低,因为子节点不存储真正的数据所以B+树的树高也会比B树低很多不需要几层就能存储较大数据,会大大磁盘IO次数。

B+树叶子节点数据是顺序排放的,所以B+树结构对范围查询有天然优势,方便遍历。

B+树结构树的层高稳定,B+树查询效率稳定性更好, 在B+树结构中,分支节点并不存储数据,分支节点只是叶子节点的索引,对于任意关键字的查找都必须从根节点走到分支节点,所有关键字查询路径长度相同,每个数据查询效率相当。B树结构其每一个分支节点上也都保存数据,因此对于每一个数据的查询所走的路径长度是不一样的,效率也不一样,B树稳定性不如B+树好

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

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

相关文章

深入浅出计算机网络 day.1 概论② 因特网概述

当你回头看的时候,你会发现自己走了一段,自己都没想到的路 —— 24.3.9 内容概述 01.网络、互连(联)网与因特网的区别与联系 02.因特网简介 一、网络、互连(联)网与因特网的区别与联系 1.若干节点和链路互连…

论文:CLIP(Contrastive Language-Image Pretraining)

Learning Transferable Visual Models From Natural Language Supervision 训练阶段 模型架构分为两部分,图像编码器和文本编码器,图像编码器可以是比如 resnet50,然后文本编码器可以是 transformer。 训练数据是网络社交媒体上搜集的图像…

GEE:计算一个遥感影像的空像素占比

作者:CSDN @ _养乐多_ 本文将介绍,如何在 Google Earth Engine (GEE) 平台计算一个遥感影像的空像素占比,其中,包含获取研究区内所有像素的总数的代码,以及获取非空像素的总数的代码。 结果如下图所示, 文章目录 一、核心函数1.1 获取研究区内所有像素的总数1.2 获取非…

使用正则表达式判断是否是数字(适用于更复杂的数字格式)

re.match("^-?\d(\.\d)?$", n) is not None 在Python中,re.match()函数用于从字符串的开始位置匹配正则表达式模式。如果匹配成功,它返回一个匹配对象;如果匹配失败,它返回None。 表达式re.match("^-?\d(\.\d…

Leetcode 3075. Maximize Happiness of Selected Children

Leetcode 3075. Maximize Happiness of Selected Children 1. 解题思路2. 代码实现 题目链接:3075. Maximize Happiness of Selected Children 1. 解题思路 这一题只需要想清楚一个点就行了: 正常情况下,对于确定的n次选择,无…

C++模板扩展

目录 1.非类型模板参数 2.模板的特化 1.非类型模板参数 我们知道,模板一般是不指定类型的,具体是什么类型由其他部分的代码的决定。 模板参数分为类型模板参数和非类型模板参数。 类型形参即:出现在模板参数列表中,跟在class或者…

Redis保证数据一致性-延时双删代码实现

Redis和数据库的数据一致性在某些场景下非常重要,如何最大程度保证Reids和数据库之间的数据一致呢? 想必大家第一时间会想到延时双删策略: 在修改数据库之前删除缓存,然后数据库中的数据修改完成后,再过一段时间再删…

APP2:android studio如何使用lombok

一、前言 不知道从哪个版本开始,android studio便无法在plugins中下载lombok了,有人说是内置了,好像有这么回事儿。我主要面临如下两个问题: 使用内置lombok,可以自动生成setter、setter、toString等。但是&#xff0…

mediapipe 实现姿态分析——举手检测

目录 人体姿态检测 效果展示 举手检测 行业应用 代码实现 代码分析 效果展示 代码修改,一只手举起即可 总结 啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦^_^啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦♪(^∇^*)啦啦啦…

踏上Python之旅:从零开始,全面解析Python安装与环境配置的必知必会

在踏入Python编程殿堂之前,首当其冲的任务就是正确安装并配置Python开发环境。本文将引导您掌握Python的安装过程、不同操作系统下的最佳实践,以及如何进行多版本管理和虚拟环境设置,为您的Python开发之路打下坚实基础。 一、Python安装 Windows系统: 访问官网下载: 打开…

休息日的思考与额外题——纯纯暴力day42

文章目录 前言动态规知识点 动规五部曲一、100233. 重新分装苹果二、100247. 幸福值最大化的选择方案总结 前言 一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油! 二刷决定精刷了,于是参加了卡子…

Linux 自动检测进程是否存活,如果挂掉自动拉起

以 jupyter 服务为例 1、检测脚本 vim /home/ailab/bin/check_ailab.sh #!/bin/bashPID$(ps -ef|grep -v grep|grep "jupyter" |awk {print $2})# 检查进程是否存在 if [ -z "$PID" ]; then# 进程不存在,启动进程echo "Jupyter Noteboo…

使用Vue.js开发前端项目

Vue.js是一个非常受欢迎的渐进式JavaScript框架,用于开发强大而互动的前端应用程序。Vue易于上手,同时拥有强大的功能库和灵活的生态系统。在本篇博客中,我将带你了解使用Vue.js开发项目的基本步骤,并提供相应的代码示例。 环境安…

自由职业者如何在Fiverr兼职赚美金

在这个忙碌的时代,大家都渴望在业余时间找到一份兼职,为自己带来额外的收入。然而,很多人常常感到困惑,不知道如何找到一份既赚钱又不耗费太多时间精力的兼职。今天,我想分享一个新的赚钱平台——Fiverr,让…

qt使用QAxObject操作excel程序关闭之后excel进程未被关闭的解决方案

💂 个人主页:pp不会算法^ v ^ 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 今天突然发现电脑变得很卡,我以为内存占用率过高了一看才50%&…

软件测试 需求

文章目录 1. 需求1.1 什么是需求1.2 为什么要有需求1.3 测试人员眼中的需求1.4 如何深入理解需求 2. 测试用例的概念2.1 什么是测试用例2.2 为什么要有测试用例 3. 软件错误(BUG)的概念4. 开发模型和测试模型4.1 软件的生命周期4.2 瀑布模型(…

【深度学习笔记】6_10 双向循环神经网络bi-rnn

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 6.10 双向循环神经网络 之前介绍的循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的,因此它们都将信…

STM32---IIC通信协议(含源码,小白进)

写在前面:在前面的学习过程中,我们学习了串口通信的USART(通用同步异步收发器),本节我们将继续学习一种串行通信协议——IIC通信协议。之前我使用51单片机也分享过相关的IIC通信的知识,其实本质的知识是相通…

Spring Boot 整合 MongoDB:构建高效的数据驱动应用

Spring Boot 整合 MongoDB:构建高效的数据驱动应用 在现代软件开发中,数据持久化是应用程序不可或缺的一部分。MongoDB,作为一个流行的NoSQL数据库,以其灵活的数据模型和强大的扩展性赢得了众多开发者的青睐。Spring Boot&#x…

LeetCode_Hot100_栈_394字符串解码_Python

1.题目(中等难度) 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b…