数据库-索引

数据库三大范式

列的原子性--非主键列完全依赖于主键--且只依赖于主键

连接泄露--一样的就是留下没有关闭的连接无法使用

索引

优点-加快检索速度-唯一性索引可以保证数据唯一性-加速表表连接

缺点--创建维护需要时间空间

B树索引-平衡树索引

实际上都是B+树实现的

m阶B-Tree-每个节点最多m个子节点

除根节点和叶节点之外每个结点最少有m/2向上取整的子节点

叶子节点同一层,从小到大排列

B+ Tree优化了-

非叶节点只存关键字信息--具体数据在叶节点包含全部信息---叶子节点之间都有一个链指针

Hash索引

直接哈希

位图索引

针对比如性别,行政区这种固定值的,并且静态不更改的数据

直接001,010,110这样子赋值

B+ 树的优点-节点只存发键-同一内存页可以读取多个数据-因可以logn找到最小的节点通过链表遍历全数据

hash索引只能等值无法范围查询-不支持排序-无法支持模糊查询-

避免不了回表-B+树符合聚簇索引和覆盖索引的时候可以没有回表

hash碰撞多的话不稳定-B+树稳定查找

前缀索引-只使用长字符串的前缀进行索引-根据平均匹配度选择长度-

联合索引(多列索引)-- 遵循最左优先--where语句使用最频繁的放在左边

(a,b,c)索引-则有(a), (a.b),(a,b,c)

遇到>,<,between, like 就会停止匹配

where语句 ab c d可以换顺序

where b=1 and a=1没问题

where b =1 无法使用索引

添加索引原则--查询使用很少不加--数据值很少的不加比如性别-text\image\bit 数据很大不加--

修改性能远远大于检索性能的时候不加,因为需要频繁更新索引

定义外键的数据列必须有索引-避免全表查询

聚簇索引--是数据存储方式--数据存储与数据放在一起--

InnoDB 支持聚簇索引--非叶节点按主键顺序-叶子节点存放主键以及行记录

特点--更高检索效率--减少磁盘IO次数--一个表只能有一个聚簇索引--频繁使用排序的字段创建聚簇索引

决定物理存储结构--包含了所有的数据

非聚簇索引--也是B树结构,但是只存储指向数据行的指针

包括覆盖索引--包含select数据字段----索引数据放置节点中--防止回表操作

复合索引--包含多个where条件字段----联合索引---通过索引找到主键--然后可能需要回表

InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:

(1)如果表定义了主键,则PK就是聚集索引;

(2)如果表没有定义主键,则第一个非空唯一索引(not NULL unique)列是聚集索引;

(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

回表查询,先定位主键值(非主键的索引列),再定位行记录(聚簇索引),它的性能较扫一遍索引树更低。

聚集索引(主键或第一个唯一索引)就不会回表,普通索引就会回表。

比如select name from table where name = "shenzhen"

这样name命中索引树,id也找到了,已经包含了需要select的信息,所以不需要回表

而select name, sex from 。。。 中的sex信息必须回表才可以找到

索引覆盖---常见的方法是:将被查询的字段,建立到联合索引里去。

事务

锁来实现事务,事务就是一组数据库操作命令-必须全部执行或者全部不执行--正确的状态转换

事务的状态主要有--活跃状态、主内存-缓冲区

部分提交--所做更改依然处于缓冲区--失败状态--中止状态--提交状态--一致状态

具有ACID--原子性(必须全部执行或者不执行)-一致性(一致状态)-隔离性(不干扰)--持久性--持久化到数据库

采用日志来保证原子性-一致性-持久性--根据日志记录来判断

锁机制----来实现隔离性--持有锁的事务才可以更新该数据

脏读--读取其他事务未提交的数据--只读取了一次

不可重复读-查询两次--数据被其他事务update

幻读----查询出/或者更新整个表的数据两次或者其他涉及到整个表的数据行两次,其他事务新增数据行导致还有数据未修改

丢失更新-----顺序修改一个数据,导致前面的更新丢失

4种隔离级别

读取未提交----能够读取未提交的数据-所有四种都无法隔离

读取已提交---可以避免脏读,提交才能读---

可重复读--避免脏读不可重复读丢失更新--以及无法在读的时候更新数据--那么也就不会有丢失更新

可串行化--所有的避免

MySQL默认是可重复读--也就是仅仅无法避免幻读,因此需要避免操作所有数据行得时候新增数据

串行化会就是逐次执行事务-牺牲了系统得并发性

6种类型

共享锁(S)-他读锁--可以并大读取数据但是不能修改

可以多次加共享锁--

select .... lock in share mode

排他锁(X)--独占锁-写锁---增删改的时候禁止其他操作

select ... for update

其他无法任何操作

更新锁(U)--防止出现死锁--如果两个事务都是先读取再修改

这样子都加了S,因为两个都不释放,无法转换成X,所以死锁了

更新锁只分配给一个事务-修改的时候就会自动变成排他锁,否则就是共享锁

意向锁-架构锁--大容量更新锁--

读取未提交----不需要加锁

读取已提交--加S,语句执行结束后释放

可重复读---加共享锁--但是必须事务结束后才释放

可串行化---锁定所有的键直到提交

死锁--占用共享资源互斥-请求保持--独占不可剥夺-循环等待

解决死锁--并发尽量顺序访问表-一次锁定所有资源--升级锁定颗粒度比如表级锁

银行家算法--尝试分配---

#你觉得今年春招回暖了吗#
全部评论
B+ 树的叶子节点链表是双向
点赞 回复 分享
发布于 2023-03-13 23:03 日本
MVCC,多版本并发控制,它是通过读取历史版本的数据,来降低并发事务冲突,从而提高并发性能的一种机制。事务版本号、表的隐藏列、undolog 和 readview。
点赞 回复 分享
发布于 2023-03-13 23:03 日本
共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。 共享锁也是加锁了的
点赞 回复 分享
发布于 2023-03-13 21:19 日本
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 乐观锁和悲观锁是实现并发控制的手段----多个事务存取数据不破坏隔离性和一致性 悲观锁--假定会发生并发冲突-屏蔽一切违反数据完整的操作--提交之前都锁起来--写多的场景 使用数据库的锁机制 乐观锁--假定不会违反-只在提交判断是否违反数据完整性--适合读多写少的场景--提高吞吐量 版本号机制---数据每次更新同步更新版本号-如果不一致说明修改-线程更新失败 CAS算法--CAS全称compare and swap,顾名思义,即比较与交换。 该算法是一种无锁算法,可以在不加锁的前提下保证线程安全,即在没有线程被阻塞的情况下实现变量同步,因此属于非阻塞同步的范畴。 也就是保存原来的值然后比较相等则赋值
点赞 回复 分享
发布于 2023-03-13 21:17 日本

相关推荐

不服输的外卷侠很健谈:杭电来我公司还是很有认可度的,可以来试试
点赞 评论 收藏
分享
评论
3
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务