转载自https://github.com/Snailclimb/JavaGuide(添加小部分笔记)感谢作者!
补充索引基础知识(引自b站sgg视频)#
- 存储引擎,数据的基本单位是页,如果数据很少,只有一页,那就简单,是直接二分查找(不涉及磁盘IO);如果数据很多,有好几个页,那么需要对页建立一种数据结构,能够最快定位到哪一页,然后减少磁盘IO
索引介绍#
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构
索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了
索引底层数据结构存在很多种类型,常见的索引结构有:B树,B+树和Hash、红黑树。在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作为索引结构
索引的优缺点#
优点:
- 使用索引可以大大加快 数据的检索速度(大大减少检索的数据量), 这也是创建索引的最主要的原因。
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
缺点:
- 创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率。
- 索引需要使用物理文件存储,也会耗费一定空间
索引一定会提高查询性能吗
- 多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升
索引的底层数据结构#
Hash表#
哈希表是键值对的集合,通过键(key)即可快速取出对应的值(value),因此哈希表可以快速检索数据(接近O(1))
为何能够通过key快速取出value呢?原因在于哈希算法(也叫散列算法)。通过哈希算法,我们可以快速找到key对应的index,找到了index也就找到了对应的value
hash = hashfunc(key) index = hash % array_size注意,图中keys[天蓝色]是字符串,不是什么莫名其妙的人

哈希算法有个 Hash 冲突 问题,也就是说多个不同的 key 最后得到的 index 相同。通常情况下,我们常用的解决办法是 链地址法。链地址法就是将哈希冲突数据存放在链表中。就比如 JDK1.8 之前
HashMap就是通过链地址法来解决哈希冲突的。不过,JDK1.8 以后HashMap为了减少链表过长的时候搜索时间过长引入了红黑树。为了减少 Hash 冲突的发生,一个好的哈希函数应该**“均匀地”将数据分布**在整个可能的哈希值集合中
由于Hash索引不支持顺序和范围查询,假如要对表中的数据进行排序或者进行范围查询,那Hash索引就不行了,并且,每次IO只能取一个
例如:
SELECT * FROM tb1 WHERE id < 500 ;- 这种范围查询中,B+树 优势非常大 直接遍历比500小的叶子节点即可
- 如果使用Hash索引,由于Hash索引是根据hash算法来定位的,难不成把1 ~499 (小于500)的数据都进行一次hash计算来定位吗?这就是Hash最大的缺点
这里其实说的是已经找到了索引,但是索引没有数据的情形。要么通过hash一个个取数据,要么利用B+树的特性(叶子节点有完整数据)


深度和高度是对应的;根节点所在层为1层










无向图的邻接矩阵是一个对称矩阵,因为在无向图中,顶点i和顶点j有关系,则顶点j和顶点i必有关系
邻接矩阵存储的方式优点是简单直接(直接使用一个二维数组即可),并且在获取两个顶点之间的关系的时候也非常高效*直接获取指定位置的数组元素。但是这种存储方式的确定啊也比较明显即 比较浪费空间












