做网站用什,wordpress qq聊天,中国设计在线网站,网站多语言 设计#x1f397;️ 主页#xff1a;小夜时雨 #x1f397;️ 专栏#xff1a;MySQL数据库 #x1f397;️ 如何优雅的活着#xff0c;是我找寻的方向 目录 1. 基本知识2. 索引背后的数据结构总结 1. 基本知识
概念
索引是一种特殊的文件#xff0c;包含着对数据表里所有… ️ 主页小夜时雨 ️ 专栏MySQL数据库 ️ 如何优雅的活着是我找寻的方向 目录 1. 基本知识2. 索引背后的数据结构总结 1. 基本知识
概念
索引是一种特殊的文件包含着对数据表里所有记录的引用指针。可以对表中一列或者多列创建索引并指定索引的类型各类的索引有各自的数据结构来实现。 索引存在的意义就是就是为了加快查询速度因为实际开发中查询场景用的多。 但是也付出了一定的代价 需要付出额外的空间来保存索引的数据。索引可能会拖慢新增删除和修改的速度。 作用 数据库中的表数据索引之间的关系类似于书架上的图书书籍内容和目录的关系。索引所起的作用类似于数据目录可以快速定位检索数据。索引对于提高数据库的性能有很大的帮助。 使用场景
要考虑对数据库表的某列或者几列创建索引需要考虑以下几点 数据量较大且经常要对这些列进行条件查询插入和修改操作较少索引会占用额外的磁盘空间 那么也就引申出什么时候不要用索引
经常增删改的列不要建立索引有大量重复的列不建立索引
2. 索引背后的数据结构
索引背后使用的是 B 树。
1. 为什么不使用 二叉搜索树或者哈希表来存储索引数据 对于二叉搜索树二叉搜索树的特点是每个非叶子节点都有两个孩子节点 如果元素的个数多了那么树的高度就会很高自根节点向下搜索需要访问的叶子结点也会非常多这就大大降低了查询的效率。树的高度相当于是比较次数对于数据库来说就是 IO 的访问次数。 对于哈希表: 虽然查询的快但是哈希表是 key-value 结构的需要知道 key 是多少通过哈希函数来计算到下标进而查找到数据但是模糊查询的时候key 值无法确定也就查询不到数据了即是不支持范围查询和模糊查询。
2. 索引结构为什么不使用 B 树(或者B- 树)
B 树可以认为是一个N叉搜索树 结构如下
B 树的特点
每个节点都可以存储多个数据这些多个数据就划分出了一定的区间在搜索的时候就不用访问那么多的叶子节点而是直接在细分的区间去查找提高了效率。
MySQL索引结构–B 树
结构如下 B树的特点
一个节点可以存储 N 个keyN 个key又划分出 N 个区间 不是 N1 个区间看图可知整个树的数据都是在 叶子节点上的所有非叶子节点上的数据都会在叶子节点中出现同时也是叶子结点的最大值。也就是每个节点中的 key 值都会在子结点中出现同时该key也是子节点的最大值。B 树的叶子节点是首尾相连的类似于链表结构的。由于叶子节点保存完整的数据只在叶子节点这里存储每一行的数据而非叶子节点只保存key值即可
B 树的优势 一个节点中保存更多的key值所以最终树的高度是相对矮的也就是查询的时候减少了 IO 的访问次数。这里 IO 特值硬盘的访问所有的查询都会落在叶子节点也就是查询任何一个数据访问 IO 的次数是一样的也就意味着查询更加稳定稳定可以对执行效率有一个判断。B 树的叶子节点类似于链表结构方便进行范围查询。由于所有数据都是在叶子节点上非叶子节点只存储key值所以非叶子节点占用的空间是比较小的这些叶子节点可能就是在内存中缓存有进一步减少了 IO 的访问次数。 总结
B树对于哈希表来说可以处理模糊匹配的场景B树对于二叉搜索树来说深度更低查找效率更高B树对于B树来说 B树只适合随机检索而B树同时支持随机检索和顺序检索单一节点可以储存更多的数据降低查询的IO次数所有的查询都需要查找到叶子结点使得查询性能更稳定兄弟节点之间相连形成有序链表便于范围内查找增删效率也更高 ️️️ 好啦到这里有关 数据库索引 的分享就没了如果感觉做的还不错的话可以点个赞关注一下你的支持就是我继续下去的动力蟹蟹大家了我们下期再见拜了个拜~ ☆*: .. o(≧▽≦)o ..:*☆