首页 > 数据库 >MySQL索引-索引结构

MySQL索引-索引结构

时间:2023-12-25 21:55:21浏览次数:34  
标签:hash Tree 支持 查询 索引 MySQL 数据结构 结构

索引是什么

索引是帮助 MySQL 高效获取数据数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。

优缺点:

优点:

  • 提高数据检索效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗

缺点:

  • 索引列也是要占用空间的
  • 索引大大提高了查询效率,但降低了更新的速度,比如 INSERT、UPDATE、DELETE

索引结构

索引结构 描述
B+Tree 最常见的索引类型,大部分引擎都支持B+树索引
Hash 底层数据结构是用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询
R-Tree(空间索引) 空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-Text(全文索引) 是一种通过建立倒排索引,快速匹配文档的方式,类似于 Lucene, Solr, ES
索引 InnoDB MyISAM Memory
B+Tree索引 支持 支持 支持
Hash索引 不支持 不支持 支持
R-Tree索引 不支持 支持 不支持
Full-text 5.6版本后支持 支持 不支持

B-Tree

二叉树的缺点:顺寻插入时,会形成一个链表,查询性能大大降低。大数据情况下,层级较深,检索速度慢。

二叉树的缺点可以用红黑树来解决:

红黑树也存在大数据量情况下,层级较深,检索速度慢的问题。

为了解决上述问题,可以使用 B-Tree 结构。
B-Tree (多路平衡查找树) 以一棵最大度数(max-degree,指一个节点的子节点个数)为5(5阶)的 b-tree 为例(每个节点最多存储4个key,5个指针)

B-Tree 的数据插入过程动画参照:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=68
演示地址:https://www.cs.usfca.edu/~galles/visualization/BTree.html

B+Tree

结构图:

演示地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

与 B-Tree 的区别:

  • 所有的数据都会出现在叶子节点
  • 叶子节点形成一个单向链表

MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B+Tree,提高区间访问的性能。

Hash

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。
如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

特点:

  • Hash索引只能用于对等比较(=、in),不支持范围查询(betwwn、>、<、...)
  • 无法利用索引完成排序操作
  • 查询效率高,通常只需要一次检索就可以了,效率通常要高于 B+Tree 索引

存储引擎支持:

  • Memory
  • InnoDB: 具有自适应hash功能,hash索引是存储引擎根据 B+Tree 索引在指定条件下自动构建的

标签:hash,Tree,支持,查询,索引,MySQL,数据结构,结构
From: https://www.cnblogs.com/qymblogs/p/17927051.html

相关文章

  • mysql主从同步原理
    (1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个IOThread请求master二进制事件(3)同时主节点大每个O线程启动一个du......
  • 发现sql慢就加索引?非也!
    【慢Sql,耗时≈5s】在Archery平台发现近期的一个慢sql:SELECT*FROMemax_order_detailWHEREimport_order_no=? 经测试,的确是慢。SELECT*FROMemax_order_detailWHEREimport_order_no='1738120234847571968'。尝试加上limit1,依然超过5s。​【如何优化】优化方式......
  • 数据库 Mysql 多表查询,left join联合两个sql示例
    SELECTt1.RowID,t1.UserID,t1.CreateDate,t1.BatchState,t2.InputDataCount,t1.QtyFROM(SELECT@curRow:=@curRow+1ASRowID,`UserID`,DATE_FORMAT(CreateDate,'%Y-%m-%d')ASCreateDate,......
  • 数据库 MySql快速导入外部数据库流程
    适用于新安装MySql本地没有数据情况外部MySql数据库文件任务管理器停用Mysql进程将外部文件替换本地默认文件即可重启电脑导入完成。......
  • 保姆级搭建Mysql 并进行视图可视化操作
    安装MySQL数据库选择mysql5.7.36_x32.msi”,双击运行,如下图所示:在此窗口中,选择“Custom”选项,点击“Next>”进入下一步;在此窗口中,选择+号下的MySQLServer5.7.36–x64,点击中间的绿色箭头符号,添加完成如下图所示:然后点击“Next>”进入下一步进行安装;继续点击“Next>”进入下一步......
  • 美团面试:ES+Redis+MySQL高可用,如何实现?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • mysql执行计划之Extra列-Using where
    顾名思义,Extra列是用来说明一些额外信息的,我们可以通过这些额外信息来更准确的理解MySQL到底将如何执行给定的查询语句。MySQL提供的额外信息很多。这里单说Usingwhere。Usingwhere只是表示MySQL使用where子句中的条件对记录进行了过滤。与是否全表扫描或读取了索......
  • Mysql基础增删改查语句
    一,基础语句1.增加Insert(特殊的如果id自动递增的话,就不需要插入id)基本语法 insertinto表名(列1,列2,列3,列4,...) values(值,值,值)例子 insertintostudent(name,sex,age)values('张三',18,'男')插入的另外一种形式:insertinto表名set列=值,列=值,列=值,....例子 insertinto......
  • 数据结构
    数据结构概念a,分析问题,将实际问题抽象出一个人数学模型b,设计一个解决问题的模型c,编写代码,调试,测试得到最后结果什么是数据结构数据 客观事物用符号表示结构· 数据之间的存在的关系 数据结构:计算机存储和组织数据符号,相互之间的关系集合数据结构分类:逻辑结构:数据之间的关系(......
  • java 17 原生操作 mysql 5.7
    环境:JDK:17mysql:5.7和数据库打交道,在项目开发中是在所难免的。今天简单学习下在java中原生操作MySQL,demo通过maven做依赖管理。依赖在新建maven项目后,加入依赖:<dependencies><dependency><groupId>com.mysql</groupId><artifactId>mysql......