网站开发学习,未来做那个网站能致富,加强本单位政务网站建设,阿里巴巴国际贸易平台一、索引的数据结构#x1f338; 索引的数据结构#xff08;非常重要#xff09; mysql的索引的数据结构#xff0c;并非定式#xff01;#xff01;#xff01;取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存…一、索引的数据结构 索引的数据结构非常重要 mysql的索引的数据结构并非定式取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存里面内存里面的数据结构对于访问操作不敏感找数据的过程花费的时间多但是真正用于访问的数据不多硬盘上的数据操作对于访问操作比较敏感但是⚠️读写一个的硬盘 开销是远大于内存的读写一次硬盘差不多可以多些一万次内存了。 数据结构简单回顾引入innodb MySQL包含很多模块 有的解析SQL有的用于网络通信有的存储数据结构-如存储引擎本质上就是代码中的一个模块这里包含若干个代码文件····以及一大堆具体的代码 ✨✨✨最主流的存储引擎innodb 索引用的数据结构我们也只介绍innodb 我们要先知道索引是为了查找查找快的才牛波一 让我们简单的回顾一下数据结构的知识吧 正好学的次 顺序表尾插随机访问很屌 链表中间位置的插入删除很屌 栈和队列特定位置的增删查改 二叉树-二叉搜索树-平衡机制的二叉树红黑树或许可以查找速度还是很屌的 堆适合排序找最大最小 哈希表查找嘎嘎牛波一以后工作常用 那来看看哪个更适合呢 红黑树插入删除修改查询-元素有序可以处理范围查询 最大问题红黑树会在元素比较多的时候变的很高-对应比较次数就会变得很多每次比较都意味着硬盘IO操作很耗硬盘开销 单单这几个数他就已经树高变成这样了 哈希表哈希表的问题是只可以精准查询不能支持模糊查询范围查询哈希表需要通过给定的key通过hash函数映射出一个具体下标才能定位到具体位置。 二、B树 那么索引innodb引擎)到是用的什么数据结构呢 为了数据库大佬们专门搞了个数据结构叫B树其他存储引擎中可能用到hash哈希表作为索引-只能应对这种精准匹配自己的情况了 那么什么是B树呢那我们需要了解B树也叫B-树。叫B杠树 不要当土狗 B树的本质是一个N叉搜索树一个节点可以保存多个keyN个key就可以延伸出n1个分叉来N个key划分出了N1个空间4个数5个空间如下图 注意一个节点多个key和一个key 都差不多的硬盘开销 此时每个节点上都可以保存多个元素当总的元素个数固定时相较于二叉搜索树涉及到的节点总数大大降低树高也大大降低了B树和B树高度远远小于红黑树于是这么查询硬盘的IO次数也就随之减少了。 对于B树插入和删除元素就涉及拆封和合并的操作比如拆分是确认区间合并是给他聚到一起当然了一个节点也不可以无脑存key就是数要不然存的太多就要变成数组了所以要把这个节点一部分key以树节点的方式重新组织。 如1234此时再加入个5就有点多了所以说此时就会把 12345 拆分成如下图保持当前节点的key始终不会太多此时就会生出新的叶节点 B树不如B树的一个点B树全集有叶子和非叶子如果写元素存到每一个节点上非叶节点占据空间比较大从而无法从内存中缓存了。 补充一个小知识点HashMap负载因子是多少 ‘0.75’链表长度多少时候转化为红黑树 ‘8’ 但是首先HashMap不是哈希表只是哈希表的一种表达方式但是最好不要记参数最好要根据实际情况。 三、B树 B树在B树的情况下又做出了一些改进-针对数据库的场景展开的 1.B也是二叉搜索树但是N个key分出了N个区间其中最后一个就是相当于最大值 2.父节点的key在子节点重复出现而且是以最大值的身份 看起来会有很多的元素浪费空间但实际上可以起到非常重要的作用上面存在的下面都有叶子节点这一层包含了整个数据的全集 3.把叶子节点按照链表方式首尾相连此时可以通过叶子节点之间的连接快速找到上一个/下一个的元素 四、B树的优点产生的优势 1.特别擅长范围查询 2.所有的查询操作最终都会落在叶子节点比较次数是均衡的查询时间是稳定的还是那句话‘有时候稳定比快更好’时快时慢用户的体验会不好慢点但是稳定才好。 3.在B树中叶子节点上是完整的数据全集注意哈1不是只代表1而是代表ID为1的连接。如同 1 -张三-90分因此表中的每一个数据的其他列都可以得到在叶子节点上只存储构建索引的id就行就相当于一个网址链接 物理层面不需要表格这样的数据结构直接使用B树来存储这个表的数据‘表格’只是用户看起来这个像是个表格而已此时非叶子节点的存储空间消耗是非常小的叶子存在硬盘非叶子可以存在内存中此时进行数据查询的时候就可以通过内存来直接比较从而更快速的找到叶子节点上的记录进一步又减少了硬盘IO的次数 五、事务的基本情况 什么叫事务呢 假如说表balance(accountId,balance) 1 , 1000 2 , 1000 1号给2号转账500分为两步第一步给1账户扣500给2账户500中间还不能有差错不然用户脑袋气死了 执行的时候肯定是不知道哪一步会失败❗️❗️然后事务的本质是把多个操作打包成一个操作完成的让这个操作要不我就全部完成要不我就完全失败那种——原子性 ⚠️⚠️完全失败不是说一个没做而是说假如第一步做了但是第二步失败了他的选择是把第一步给还原回去。这个还原我们也管他叫回滚 如何实现回滚呢只要把事务中执行的每个操作都记录下来通过特定的日志来记录数据库事务操作的中间过程如果需要回滚按照之前的操作的“逆操作”就可以了。 如1号-5002号500 若执行第一步的过程中如果程序崩溃了此时就要对第一步进行回滚 数据库会自动把第一步操作的修改还原回去那么假如数据库挂了呢重启了捏 我们是通过日志来记录事务执行的中间过程的日志中的数据始终在硬盘上存在的。即便是数据库服务器重启就会在启动之后针对之前没回滚完成的情况继续处理 要么是全部成功要么是一个都不执行。 事务-原子性-回顾-特定日志 六、事务的使用方式 开启事务start transaction 下面就可以输入多个sql语句了 提交事务commit。 把这些SQL按照原子的方式进行执行 手动出发回滚rollback 手动触发回滚 一个事务务必以后两条操作结尾(当然了解命令即可不会用这个命令我们一般是使用代码去操作事务) 七、事务的基本特性面试题理解的去思考去记 1.原子性保证多个操作被打包成一个整体要不全成要不一个也不做。 2.一致性事务执行之前和事务执行之后数据能对上数据不能够太牛马离谱 3.持久性事务这里的各种操作都是持久生效最终写到硬盘上即使关机也不影响的 4.隔离性并发执行事务时候隔离性会在执行效率和数据可靠之间做出权衡隔离描述的是在同时执行的事务之间相互的影响隔离性越高并发性越低数据越可靠性能也就越低。下一篇会介绍并发的家人们别急