MySQL的B+树索引和hash索引的区别

简述一下索引:

索引是数据库表中一列或多列的值进行排序的一种数据结构;索引分为聚集索引和非聚集索引,聚集索引查询类似书的目录,快速定位查找的数据,非聚集索引查询一般需要再次回表查询一次,如果不使用索引就会进行全表扫描;还有可以进行多字段组成联合索引,但是要符合最左匹配原则要求。

如果使用覆盖索引就可以不回表扫描。
索引类型: InnoDB引擎,默认B+树(O(logN))、Hash索引 B树索引 O(1)

1、由于底层是使用hash表,以key-value存储,无法直接通过索引查询,只选择一个数据hash索引更快,但是如果选择N条数据,hash索引的时间复杂度是O(N),由于B+树索引有序,且叶子节点有链表连接,查询效率比hash索引快
2、索引在硬盘保存,一般不会一次性保存到内存中,B+树可以设计允许数据分批加载,同时树的高度较低,查询速率较快
3、硬盘的I/O速度相比内存来说非常慢,而索引是用于加快查询速度的,需要减少I/O操作,内存和磁盘以页为单位交换数据,为了减少I/O,索引在新建节点的时候,是直接申请一个页的空间,存储分配是按页对齐,就实现了一个节点一次I/O。
4、B+ 树是平衡树,它查找任意节点所耗费的时间都是完全相同的,比较的次数就是 B+ 树的高度

B+ Tree索引和Hash索引区别?

哈希索引适合等值查询,但是无法进行范围查询 和模糊查询
不能使用索引对哈希索引进行排序。

[En]

Hash indexing cannot be sorted by using the index.

哈希索引不支持多列联合索引的最左侧匹配规则。

[En]

Hash indexing does not support leftmost matching rules for multi-column federated indexes.

如果存在大量重复的键值,则哈希索引的效率会因为哈希冲突问题而变得非常低。

[En]

If there are a large number of repeated key values, the efficiency of hash indexing will be very low because of the hash collision problem.

索引的种类有哪些?分别的特点是什么?

普通索引:加速查询
唯一索引:加速查询 + 列值唯一 + 可以为null
主键索引:加速查询 + 列值唯一 + 不可为null + 表中只有一个
组合索引:多列值形成一个索引,专门用于组合搜索,比索引合并更高效

[En]

Combinatorial index: multiple columns of values form an index, dedicated to combinatorial search, more efficient than index merging

全文索引:分词和搜索文本内容

[En]

Full-text indexing: word segmentation and search for the content of the text

不适合作为索引

更新频繁的字段不适合创建索引
不会出现在where子句中的字段

聚簇索引和非聚簇索引的区别

  1. 在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引**

联合索引、最左前缀匹配

创建联合索引时,会选择识别度最高的放在最左边,由于mysql遵循最左前缀匹配原则,从联合索引最左边开始匹配。创建一个联合索引(key1,key2,key3),其实创建了(key1)(key1,key2)(key1,key2,key3)三个索引。

索引下推、查询优化

mysql 5.6版本优化内容:Index Condition Pushdown(索引下推)默认开启,
比如:

people表中(zipcode,lastname,firstname)构成一个索引

SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';
  • 如果没有使用索引下推技术,则MySQL会通过zipcode=’95054’从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE ‘%etrunia%’和address LIKE ‘%Main Street%’来判断数据是否符合条件。
  • 如果使用了索引下推技术,则MYSQL首先会返回符合zipcode=’95054’的索引,然后根据lastname LIKE ‘%etrunia%’和address LIKE ‘%Main Street%’来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

如果它对你们大家有帮助,请更喜欢它。

[En]

If it is helpful to all of you, please like it more.

本文作者:好名字
原文链接:MySQL的B+树索引和hash索引的区别
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

Original: https://www.cnblogs.com/cuizb/p/15600868.html
Author: Java技术债务
Title: MySQL的B+树索引和hash索引的区别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507996/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 自定义表单 动态表单 表单设计器 流程引擎 设计方案

    作流模块——————————- 1.模型管理 :web在线流…

    数据库 2023年6月6日
    068
  • SQL的函数

    MySQL常用的日期函数函数 功能 curdate() 返回当前日期 curtime() 返回当前时间 now() 返回当前日期和时间 year() 获取指定date的年份 mon…

    数据库 2023年6月16日
    099
  • 银河麒麟V10安装MySQL8028

    记一次成功安装MySQL8028到银河麒麟V10,并实现远程访问的方法 工具/原料 数据库下载地址(实验版如图): [En] Download address of the dat…

    数据库 2023年5月24日
    081
  • loadrunner 无法保存许可信息

    1.CONFUGURATION—>loadrunner license—>New License页面,输入许可信息,提示:无法保存许可信息 2.解决方法,使用管理员角色…

    数据库 2023年6月14日
    096
  • [spring]spring中java实现类代替注解开发

    9.使用javaconfig实现代替xml配置 The central artifacts in Spring’s new Java-configuration sup…

    数据库 2023年6月16日
    062
  • MySQL实战45讲 19

    19 | 为什么我只查一行的语句,也执行这么慢? 有些情况下,”查一行”,也会执行得特别慢。 需要说明的是,如果 MySQL 数据库本身就有很大的压力,导致…

    数据库 2023年6月14日
    065
  • 23种设计模式之访问者模式(Visitor Pattern)

    文章目录 概述 访问者模式的优缺点 访问者模式的使用场景 访问者模式的结构和实现 * 模式结构 模式实现 总结 概述 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可…

    数据库 2023年6月6日
    081
  • 工作中常用Less知识点实践总结

    工作中常用Less知识点实践总结,帮助你更好的使用Less 我所理解的Less的一些好处 函数式编程css 自定义变量用于整体主题调整 嵌套语法简化开发复杂度 mixin的写法 ….

    数据库 2023年6月11日
    074
  • 【黄啊码】教你用python画冰墩墩

    python;gutter:true; import turtle</p> <p>turtle.title('PythonBingDwenDwen…

    数据库 2023年6月16日
    054
  • markdown语法

    特殊字符对照表 点击查看特殊字符对照表 特殊字符 描述 字符代码 空格符 & 逻辑与 < 小于号 大于号 ¥ 人民币 ± 正负号 × 乘号 ÷ 除号 © 版权符号 ®…

    数据库 2023年6月6日
    059
  • Component name “Login“ should always be multi-word

    在运行vue项目的时候,看到此提示 这是因为没有关闭elint提示的错误,在vue.config.js下添加代码 lintOnSave: false Original: https…

    数据库 2023年6月11日
    073
  • Windows 装机必备

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月6日
    069
  • Vue(十三)—过滤器filter,filters

    官网:https://cn.vuejs.org/v2/api/#filters https://cn.vuejs.org/v2/api/#Vue-filter 分为全局过滤器和局部…

    数据库 2023年6月16日
    083
  • springboot~关于打包时记录当前git信息

    Maven打包发布版本可能会遇到自己的提交不起作用的情况,排查比较困难,可能需要拉下服务器上包,反编译查看是否包含自己的提交记录。如果使用的是GIT作为SCM,可以使用 git-c…

    数据库 2023年6月6日
    080
  • mysql连接

    private static String URL="jdbc:mysql://localhost:3306/mysql?serverTimezone=GMT"…

    数据库 2023年6月9日
    093
  • 2022-6-2-mysql常用的命令

    mysql -uroot -proot -h192.168.56.10表示使用mysql的客户端进行连接数据库管理系统 -u后面是连接数据库的用户名,一般默认的情况下用户名都是ro…

    数据库 2023年5月24日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球