B+Tree

MySQL索引模型

試著忘記壹切 提交于 2020-02-27 06:44:54
数据库索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。 索引的常见模型 哈希表 数组加链表实现,添加新数据较快,但是由于不是有序的,所以区间查询速度是很慢的。 哈希表适用于只有等值查询的场景,比如Memcached及其他NOSQL引擎。 有序数组 有序数组是讲索引字段有序的存放在数组中,所以在等值查询和范围查询场景中的性能就都非常优秀。 但是有序数组在插入更新时就比较麻烦,需要移动后面所有记录,成本太高;所以有序数组索引只适用于静态存储引擎。 二叉搜索树 二叉树的查询和更新复杂度均为O(log(N));假如一棵 100 万节点的平衡二叉树,树高 20,一次查询可能需要访问 20 个数据块。 所以大多数数据存储引擎采用N叉树 MySQL的索引 在MySQL中,索引是在存储引擎层实现的。Mysql索引使用的数据结构主要有 BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。 MyISAM中的索引 B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。 InnoDB中的索引

跃居AppStore第一!X-Engine如何支撑钉钉数据量激增

不羁岁月 提交于 2020-02-26 23:34:27
钉钉作为国内领先的企业IM工具,在中国有超过亿级别的用户。随着新型冠状病毒肺炎疫情的爆发,大量的企业员工选择了soho模式,企业办公协同工具的需求瞬间爆发。 钉钉作为中国企业办公IM的首选应用,不仅具有项目群、视频通话、视频会议、日报、打卡、远程投屏等基础能力,还具备深度、灵活订制各种 OA (Office Automation,办公室自动化) 应用的能力,极大方便了人与人之间的链接,可以帮助企业员工快速、高效地沟通和协作。 也因此,钉钉迅速冲上了AppStore下载免费榜单的第一位。瞬间爆发的在线办公需求,导致钉钉的访问流量激增。每天早晨的打卡风暴,迅速增长的聊天信息,一次次的流量洪峰冲击着钉钉的业务后台。但是借助于阿里云提供的弹性基础设施,钉钉平稳的渡过了每一次的流量洪峰。 在亿级别的用户体量下,钉钉的消息系统,除了要保证消息及时正确地传递,还要保证已读/未读等特有功能。而且不同于市场上常见的用户级IM工具,企业IM需要实现聊天记录的永久保存,并且提供多端漫游功能。 在用户量持续爆炸性增长的前提下,聊天记录永久保存给钉钉业务带来极大的成本压力。同时在数据爆炸的前提下保证聊天记录的读写性能不降低也是一个极大的挑战。 面对这些挑战,钉钉业务选用了X-Engine作为全量钉钉消息的最终存储引擎,实现了性能和成本的平衡。而且在此次企业协同办公需求爆发期间

MySQL调优系列——MySQL B+Tree索引和Hash索引的区别?

橙三吉。 提交于 2020-02-26 14:29:45
1、B+Tree索引 1、B+Tree首先是有序结构,为了不至于树的高度太高,影响查找效率,在叶子节点上存储的不是单个数据,提高了查找效率; 为了更好的支持范围查询,B+树在叶子节点冗余了非叶子节点数据,为了支持翻页,叶子节点之间通过指针相连; 2、B+树算法 : 通过继承了B树的特征, 通过非叶子节点查询叶子节点获取对应的value ,所有相邻的叶子节点包含非叶子节点,使用链表进行结合,有一定顺序排序,从而 范围查询效率非常高 。 缺点 :因为有 冗余节点数据,会比较占内存 。 2、Hash索引 ’ 1、Hash是k,v形式,通过一个散列函数,能够根据key快速找到value 2、哈希索引就是采用一定的hash算法,把键值换成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需要一次hash算法即可立即定位到相应的位置,速度非常快。 缺点 : 因为底层数据结构是散列的,无法进行比较大小, 不能进行范围查找 3、B+树索引和hash索引的明显区别: 1、如果是等值查询,那么hash索引有明显的优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个键值是唯一的,如果不唯一,则需要先找到下标位置再链式查找。 2、从示意图可以知道,hash索引无法支持范围查询,因为原先是有序的键值,但是经过hash算法后,有可能变成不连续的,就没有办法利用索引完成范围查询检索数据

美团7面 问了哪些问题 java 4年

与世无争的帅哥 提交于 2020-02-26 13:49:12
前提:包括电面,美团一共7面,面了两个部门,后面一个部门面完hr面,等通知。结果凉凉。 详细的已经记不清楚了,每个问题都是根据回答再继续扩展问,只是简单的列一下。 explain的用法 分布式锁 写接口时考虑哪些 事务的传播机制 分布式一致性 线上遇到的问题,怎么解决 rabbitmq 消息发送的流程 rabbitmq如果一个消息堵在了队列头,如何处理 是否使用过rabbitmq的ack应答机制 rabbitmq的持久化 volitile关键字 threadlocal的使用场景 锁有哪几种 创建线程池的参数的含义 动态代理有哪些? mybatis的查询过程 btree和b+tree和二叉树、红黑树有什么区别 spring中用到哪些设计模式 来源: oschina 链接: https://my.oschina.net/wuyiyi/blog/3159617

MySQL概述

本小妞迷上赌 提交于 2020-02-25 20:06:11
MySql主要概念 参考:https://snailclimb.gitee.io/javaguide/#/database/MySQL MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。 1 存储引擎 1.1 查看引擎的命令 查看MySQL提供的所有存储引擎 mysql> show engines; 查看MySQL当前默认的存储引擎 我们也可以通过下面的命令查看默认的存储引擎。 mysql> show variables like '%storage_engine%'; 查看表的存储引擎 show table status like "table_name" ; 1.2 MyISAM和InnoDB区别 是否支持行级锁 : MyISAM 只有表级锁(table-level locking),而InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持

mysql相关

对着背影说爱祢 提交于 2020-01-09 12:18:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言:在2019年的年末,我又再一次的踏上了面试的漫漫征途。每次的面试准备都是对自己学习的一次积累。目前已经尘埃落定,将自己面试准备的东西做一次整理。 面试准备时长:1.5个月 mysql基本上每次面试都会问道,对于工作四年的开发人员来说,需要准备的知识也非常多。 一、事务隔离级别 read uncommied :即便事务没有commit,但是我们仍然能够读到未提交的数据,这是所有隔离级别中最低的一种 read commited :可以读取其他事务提交的数据,这也是大多数数据库默认的隔离级别 repeatable read :可重读 --mysql的默认隔离级别 serializable :串行化,将当前会话的隔离级别设置为serilizable时,其他会话对该表的写操作将会被挂起。这样做对性能会造成影响。 二、索引 索引的本质 官方定义为:索引(index)是帮助mysql高效获取数据的数据结构。 B-Tree和B+Tree b-tree 的示意图如下所示: btree索引的每个节点中不仅包含数据的key值,还有data值。而每一页的存储空间是有限的,如果data数据较大时,会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时,同样会导致B-tree的深度较大,增大查询时的磁盘I/O次数

Mysql为什么采用B+Tree

拟墨画扇 提交于 2020-01-08 10:45:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 为什么不是B-Tree或者红黑树呢 为什么不是B-Tree 1.减少IO次数 磁盘每次IO读取出的数据量大小是一致的,当单次IO查询出的内容越多,那么查询的IO次数就越少,性能就越好。 而B-Tree因为其根节点存放的有指针,所以自然其内存消耗多,同等数据体量下IO次数也要比B+Tree多。 2.基于范围查询性能考虑。 因为B+Tree只有叶子节点才存放指针,叶子上有优化,所有的叶子节点可以通过指针串联起来,方便基于范围查询的频繁访问。 3.最主要的还是因为B+Tree的遍历效率高。 为什么不是红黑树之类的 大量数据下,红黑树他们因为深度过大,而造成的IO读写过于频繁,不适合检索。 B-Tree B+Tree 来源: oschina 链接: https://my.oschina.net/fusublog/blog/3154709

innodb的聚集索引(聚簇索引)

大憨熊 提交于 2019-12-06 03:37:23
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式(不是数据结构,而是存储结构),具体细节依赖于其实现方式,但innodb的聚簇索引实际上是在同一个结构中保存了BTree(B-Tree ,B+Tree)索引和数据行。 https://blog.csdn.net/u013235478/article/details/50625677 这个链接里介绍了BTree索引 聚簇索引(clustered index)也称为聚集索引,聚类索引,簇集索引,聚簇索引确定表中数据的物理顺序。 聚集索引:类似字典的拼音目录。表中的数据按照聚集索引的规则来存储的。就像新华字典。整本字典是按照A-Z的顺序来排列。这也是一个表只能有一个聚集索引的原因。因为这个特点,具体索引应该建在那些经常需要order by,group by,按范围取值的列上。因为数据本身就是按照聚集索引的顺序存储的。不应该建在需要频繁修改的列上,因为聚集索引的每次改动都以为这表中数据的物理数据的一次重新排序。 聚集索引默认是按照每张表的主键构造一棵B+Tree(平衡查询树),树中的叶子节点存放着表中的行记录数据,因此,也将聚集索引的叶子节点称为数据页;非叶子节点中存放着仅仅是键值和指向叶子节点的偏移量。每个叶子节点(数据页)都通过一个双向链表进行连接。 由于实际的数据页只能按照一棵B+树进行排序,因此数据库中每张表只能有一个聚集索引。

mysql的索引 数据结构

北城以北 提交于 2019-12-05 11:31:49
二叉搜索树 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树 二叉平衡树 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树. 由于普通的二叉查找树会容易失去”平衡“,极端情况下,二叉查找树会退化成线性的链表,导致插入和查找的复杂度下降到 O(n) ,所以,这也是平衡二叉树设计的初衷。 二叉树,它的搜索时间复杂度为 O(log2N) ,所以它的搜索效率和树的深度有关,如果要提高查询速度,那么就要降低树的深度。 要降低树的深度,很自然的方法就是采用多叉树,再结合平衡二叉树的思想,我们可以构建一个平衡多叉树结构,然后就可以在上面构建平衡多路查找算法,提高大数据量下的搜索效率。 B-树 定义: 1. 有一个根节点,根节点只有一个记录和两个孩子或者根节点为空; 2. 每个节点记录中的key和指针相互间隔,指针指向孩子节点; 3. d是表示树的宽度,除叶子节点之外,其它每个节点有[d/2,d-1]条记录,并且些记录中的key都是从左到右按大小排列的,有[d/2+1,d]个孩子; 4. 在一个节点中,第n个子树中的所有key,小于这个节点中第n个key,大于第n-1个key

InnoDB:B+Tree、聚簇、二级索引原理、架构及应用

删除回忆录丶 提交于 2019-12-05 07:38:52
1、二叉树 二叉搜索树是最为大家所熟知的一种数据结构,就不展开介绍了,它为什么不适合用作数据库索引? (1)当数据量大的时候,树的高度会比较高,数据量大的时候,查询会比较慢; (2)每个节点只存储一个记录,可能导致一次查询有很多次磁盘IO; 2、B-Tree IO次数就是树的高度,而“矮胖”就是b树的特征之一, B树属于多叉树又名平衡多路查找树(查找路径不只两个) B树,如上图,它的特点是: (1)不再是二叉搜索,而是m叉搜索; (2)叶子节点,非叶子节点,都存储数据; (3)中序遍历,可以获得所有节点; 画外音,实在不想介绍这个特性:非根节点包含的关键字个数j满足, (┌m/2┐)-1 <= j <= m-1 ,节点分裂时要满足这个条件。 B树被作为实现索引的数据结构被创造出来,是因为它能够完美的利用“局部性原理”。 什么是局部性原理? 局部性原理的逻辑是这样的: (1)内存读写块,磁盘读写慢,而且慢很多; (2) 磁盘预读 :磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据,每次加载更多的数据,如果未来要读取的数据就在这一页中,可以避免未来的磁盘IO,提高效率; 画外音:通常,一页数据是4K。 (3) 局部性原理 :软件设计要尽量遵循“数据读取集中”与“使用到一个数据,大概率会使用其附近的数据”,这样磁盘预读能充分提高磁盘IO; B树为何适合做索引? (1