引言
1、索引的本质:索引是帮助MySQL高效获取数据的排好序的数据结构
2、可以做索引结构:
(1)数组,依赖下标。
(2)链表
(3)哈希
(4)二叉树
(5)B树
(6)B+树

3、MySQL的索引为啥是B+Tree?
答题线路:全部遍历→Hash→二叉树→平衡二叉树→B-Tree→B+Tree
一、全部遍历(没有索引)
从头到尾扫描,根据实践经验,如果数据规模在2千条以下,可以直接查找,时间也是很快的,毕竟数据规模小。但是随着规模的扩大,是一定要建立索引,提高查找效率。比如没有目录的牛津字典,那查找起来,不得…
二、哈希(Hash)
1、Hash函数:JDK的hash函数非常经典,建议熟记:
int hash(Object key){
int h = key.hashCode();
return (h ^ (h>>>16)) & (capitity-1); // capicity表示散列表的大小。
}
2、HashMap的底层数据结构:分JDK1.7和JDK1.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中对

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

被折叠的 条评论
为什么被折叠?



