索引数据结构之哈希、红黑树(Red Black Tree)、B树(B-Tree)、B+树详解

本文深入探讨了数据库索引的多种类型,包括数组、链表、哈希、二叉树、B树及B+树,重点讲解了MySQL为何选择B+树作为索引结构,以及各种索引类型的优缺点。
引言

1、索引的本质:索引是帮助MySQL高效获取数据的排好序的数据结构
2、可以做索引结构:
(1)数组,依赖下标。
(2)链表
(3)哈希
(4)二叉树
(5)B树
(6)B+树
在这里插入图片描述
3、MySQL的索引为啥是B+Tree?
 答题线路:全部遍历→Hash→二叉树→平衡二叉树→B-TreeB+Tree

一、全部遍历(没有索引)

从头到尾扫描,根据实践经验,如果数据规模在2千条以下,可以直接查找,时间也是很快的,毕竟数据规模小。但是随着规模的扩大,是一定要建立索引,提高查找效率。比如没有目录的牛津字典,那查找起来,不得…

二、哈希(Hash)

1、Hash函数:JDKhash函数非常经典,建议熟记:

int hash(Object key){
   
   
	int h = key.hashCode();
	return (h ^ (h>>>16)) & (capitity-1); // capicity表示散列表的大小。
}

2、HashMap的底层数据结构:分JDK1.7JDK1.8两个版本。
(1)JDK1.7:底层数据结构是数组+单链表
(2)JDK1.8:对 HashMap 做了进一步优化,底层数据结构是数组+单链表(红黑树),当链表过长(默认当长度超过8)时,链表就转换成了红黑树,利用红黑树快速增删改查的特点,进一步提高HashMap的性能。当红黑树的结点个数少于6时,又会将红黑树转化成链表。因此在数据量较小的情况下,红黑树因为要维护平衡,性能上的优势并不明显。

3、HashMap默认的初始大小是16,如果事先值到大概的数据量有多大,可以通过修改默认值,减少动态扩容的次数,提高HashMap性能。

4、当 HashMap 中元素个数超过0.75*capacity的时候,就会启动自动扩容,每次扩容都会扩为原来的两倍大小。(当前容量大小*2)

5、扩容的时候,会将数据全部重新计算一次,线程不安全。

6、既然线程不安全,如何改进?
(1)new ConcurrentHashMap<>();

7、HashMap & ConcurrentHashMap 的区别?
  除了加锁,原理上无太大区别。另外,HashMap 的键值对允许有null,但是ConCurrentHashMap 都不允许。
  JDK 1.7 中使用分段锁(ReentrantLock + Segment + HashEntry),相当于把一个 HashMap 分成多个段,每段分配一把锁,这样支持多线程访问。锁粒度:基于 Segment,包含多个 HashEntry
  JDK 1.8 中使用 CAS + synchronized + Node + 红黑树。锁粒度:Node(首结点)(实现 Map.Entry)。锁粒度降低了。

8、JDK1.8中对

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值