1.3.1 为什么不用哈希表
我们知道哈希表的查找效率是 O(1) 的,所以使用哈希表的话 查找一个数据就会非常的快,那为什么索引不用哈希表呢?
原因: 如果使用哈希表,只能处理相等的情况,无法处理 >
<
>=
等 情况.因为哈希表存储是没有顺序的.
1.3.2 为什么不用二叉搜索树
我们知道二叉搜索树的 中序遍历结果是有序的.如果要查找 id<6 且 id>3
的数据.可以先找到 id =3
再找到 id = 6
然后中序遍历在找到 3~6之间的数据就可以了.相比于哈希表,二叉树能处理范围查找,那为什么不用二叉搜索树呢?
原因: 如果使用二叉搜索树,二叉树每个节点最多有2个叉,当数据量大时,树的高度就会较高,最终操作的效率也会非常低,而且二叉搜索树获取到中序遍历的效率也不是很高效O(N).这样效率很低,就跟普通查找效率差不多了.
1.3.3 什么是B树
B-TREE的优势:
不再是二叉搜索,而是N叉搜索,树的高度会降低,查询快
叶子节点,非叶子节点,都可以存储数据,且可以存储多个数据
通过中序遍历,可以访问树上所有节点
1.3.4 什么是B+树
真实的索引是用的B+树.
B+TREE的优势:
-
仍然是N叉树,层级小,非叶子节点不再存储数据,数据只存储在同一层的叶子节点上,B+树从根到每一个节点的路径长度一样,而B树不是这样.(表示查询任何一条记录速度是比较平均的,不会出现效率差异大的情况.)
-
叶子之间,增加了链表(图中红色箭头指向),获取所有节点,不再需要中序遍历,使用链表的next节点就可以快速访问到
-
范围查找方面,当定位min与max之后,中间叶子节点,就是结果集,不用中序回溯(范围查询在SQL中用得很多,这是B+树比B树最大的优势)
-
叶子节点存储实际记录行,记录行相对比较紧密的存储,适合大数据量磁盘存储;非叶子节点存储记录的PK,用于查询加速,适合内存存储
-
非叶子节点,不存储实际记录,而只存储记录的KEY的话,那么在相同内存的情况下,B+树能够存储更多索引
要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
-
数据量较大,且经常对这些列进行条件查询。
-
该数据库表的插入操作,及对这些列的修改操作频率较低。
-
索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。
创建主键约束( PRIMARY KEY)、唯一约束( UNIQUE)、外键约束( FOREIGN KEY)时,会自动创建对应列的索引。
1.5.1 查看索引
show index from 表名;
示例:
1.5.2 创建索引
create index 索引名 on 表名(字段名);
示例:
1.5.3 删除索引
drop index 索引名 on 表名;
示例:
- 普通索引 : 允许被索引的数据列包含重复的值
- 唯一索引 : 可以保证数据记录的唯一性
- 主键索引 : 是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY来创建
- 联合索引 : 索引可以覆盖多个数据列,如像
INDEX(columnA,columnB)
索引
- 全文索引 : 通过建立倒叙索引,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术,可以通过
ALTER TABLE table_name ADD FULLTEXT(column)
; 来创建全文索引
=========================================================================
现有一个数据表,存储了一些人的银行账户,
现在有一个人A需要向B转账3000元.
此时就需要执行两个操作.
-
A的账户余额 - 3000
-
B的账号余额 + 3000
假如在执行操作1的时候,执行之后,网络出现错误,或 数据库挂了,A的钱少了B的钱没有增加,3000就凭空消失了?
解决方案: 使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务.
事务的基本特性称为 “ACID”
-
原子性(atomicity,或称不可分割性): 事务中的若干操作,要么全部执行成功,要么就都不执行.(这里的不执行,并不是真的不执行,而是一旦中间的某个步骤执行出错,就把前面已经执行完毕的步骤回滚(rollback)回去.)
-
一致性(consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。执行事务前后,数据始终处于一种合法的状态.(例如转账操作,减账户余额的时候,不能把账户减成负数)
-
隔离性(isolation,又称独立性): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
-
持久性(durability): 事务一旦执行完毕,此时对于数据的修改就是持久生效的(数据存到磁盘中就是持久的.存到内存中就是不持久的)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
后
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
[外链图片转存中…(img-6h16y32N-1713249490601)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!