吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2386|回复: 2
收起左侧

[Java 转载] [Java] 【个人笔记】【剑指Java面试-Offer直通车】【二】【数据库】

[复制链接]
小公主々 发表于 2021-5-1 23:40
本帖最后由 小公主々 于 2021-5-2 10:08 编辑

基本组成

1.关系型数据RDBMS组成:存储(文件系统)和程序实例(存储管理、缓存机制、SQL解析、日志管理、权限划分、容灾机制、索引管理、锁管理)

2.索引数据结构有四种

1.png

二分树

3.二分查找二叉树原理简述:左子树均小于父,右子树均大于父。缺点是增加同类型数据时,数据会变成线性结构树。每个节点只能两个子,一次查询则为一次IO。局限性在于每个数据的节点太少。



B-TREE树

4.B-Tree树定义

2.png

最后一条约束,B树不会变成线性树,结构会调整。

3.png

B+-Tree树

5.

结构特点:容纳节点更多。

数据特点:非叶子节点的子树指向P,小于K+1节点的值

算法特点:非叶子节点仅做索引,数据都保存在叶子节点中,这意味着非叶子节点可以存储更多的节点,且搜索会在叶子节点终结。当数据进行统计时,数据排序是有序的,那么查询到数据后不会再返回到非叶子节点中,而是直接从数据进行查询,即叶子节点之间有链指针。

4.png 5.png

Hash索引

6.Hash索引效率查询高,但是有缺点,首先要知道一个hash值对应多个数据值,且多个hash值跟数据是不相关的。

7.下图一三四点都是因为一个hash对应多个值导致。

8.第三点某些索引可以使用组合索引键,单部分索引也可以用来查询,而hash组合索引后得出hash值是不能用单个索引去查询的。

9.多个值时还是需要全表扫描

6.png


BitMap位图索引

10.适用于某些字段只有固定定值,且锁操作非常强,不适合高并发。

索引相关问题

总结

11.为什么使用索引:避免全表扫描

12.什么样的字段能成为索引:主键、唯一键等所有能让数据区分的字段。

13.索引数据结构:B+ B Tree、二分树、hashmap,mysql不支持bitmap。




SQL优化

1.show variables like '%query%'查询出三个字段long_query_time、show_query_log、show_query_log_file,超过1s的慢sql会存储在里面。

2.show status like '$slow_queries%'

3.可以设置关键属性,比如慢sql时间为1则记录

4.explain关键字去查看相关信息,关键字段例如type,为index或all时走全表扫描查询


7.png

5.一般情况下,mysql数据查询优化器,自动选择最优索引去查询。补充:查询时可指定强行使用某使用。

8.png

6.最左匹配原则

  a.最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(<、>、between、like)就停止匹配,复合(联合)索引情况下,查询条件中不包括索引列最左边字段则索引不会使用



MyISAM和InnoDB区别

7.锁区别:M默认表级锁,不支持行级锁(查询时会自动给表上锁,为读锁,又叫共享锁;增删改为写锁,又叫排他锁);InnoDb默认行级锁,也支持表级锁

8.InnoDb在使用索引时使用行级锁,不使用索引时使用表级锁。

9.有排他锁时,其它锁不能用;写锁可共存。锁的粒度越细,代价越高。         

10.MyISam适用场景:频繁执行count语句;增删改频率不高,查询频繁;没有事务;

11.InnoDB适用场景:增删改查都频繁;可靠性要求比较高,要求支持事务;

12.乐观锁一般通过version或者时间戳去控制.



常见并发事务问题

1.更新丢失

2.脏读(READ UNCOMMICTED隔离级别导致:事务可以读取另一个事务未提交的数据,可通过READ COMMICTED隔离级别去解决)

3.不可重复读问题,第一次读取到某个数据,另一个事务提交之后,又读取到新数据,此为数据不可靠,即不可重复读问题描述。REPEATABLE-READ隔离级别可解决该问题,此种隔离级别下,读取的数据永远为第一次数据,哪怕另外的事务数据发生改变并提交,读取依旧为原数据,但在该事务更改数据的情况下,会以另外事务提交的新数据作为源数据去修改。这种情况下描述的是已经解决了该问题。

4.幻读:原本查询到三条数据,另一个事务新增一条数据,原事务再操作时变成了四条数据,这就是幻读问题。Serializable串行化隔离级别可以解决该问题,因为该级别下会对所有sql语句执行加锁

这些问题可以统称为各级别下的并发访问问题

补充:不可重复读侧重同一条数据的修改;幻读侧重数据的新增

oracle默认已提交读,mysql默认可重复读

9.jpg

扩展:InnoDb可重复读隔离(RR)级别如何避免幻读的

通过Next-key锁实现,Next-key由行锁和Gap锁组成。

1.行锁

2.Gap锁:间隙锁,锁定周围数据以及包括行记录本身,该锁在低隔离级别下是不存在的,所以其隔离级别避免不了幻读问题。

如果Where后面的条件全部命中,例如in后面的条件全部命中,则不加Gap锁。

如果Where后面的条件部分命中或者全不命中,则会加Gap锁。(部分命中,会部分加Gap锁)

Gap锁一般用在非唯一索引或者不走索引的当前读中

如果是非唯一索引,那么官方给出的范围是左开右闭,10、11、13、20

如果是不走索引,那么锁的范围会大一点

当前读:上锁的增删改查sql语句均成为当前读,即不论是共享锁还是排它锁,因为读取的数据是最新版本的。

快照读:不加锁的非阻塞读select(前提条件是非Serializable隔离级别下)

既没有主键也没有唯一键,innodb默认会创建隐形自增主键
10.jpg

SQL语法补充

1.当用到Group by时,后面的字段必须出现在select后面,或者是其它字段的函数表达式,如果出现group by之外的字段,则会报错(同一张表内,多表不会报错)

2.Having一般用在group by后面,用于对结果的限定;where用在group by前面,用于条件的查询

3.Group by什么时候用,一般当没有给指定条件时,类似相当于所有数据的循环遍历。同时,相同的数据会合并。

本章总结

RDBMS数据库:架构、索引、锁、语法、理论范式

例如索引:1.为什么要使用索引 2.什么样的信息能成为索引 3.索引的数据结构 4.密集索引与稀疏索引的区别


myisam存储引擎,不管是主键索引,唯一键索引还是普通索引都是稀疏索引

innodb存储引擎:有且只有一个密集索引。密集索引的选取规则如下:

    若主键被定义,则主键作为密集索引

    如果没有主键被定义,该表的第一个唯一非空索引则作为密集索引

    若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)

    非主键索引存储相关键位和其对应的主键值,包含两次查找

密集索引的定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引

稀疏索引:叶子节点仅保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息机器主键

实质就是密集索引查询数据时可以不用返回到上层节点,可以直接去定位同一行数据。而稀疏索引每次都需返回上层节点并重新开始索引查询。
























免费评分

参与人数 1热心值 +1 收起 理由
PpaPingggg + 1 感谢您的宝贵建议,我们会努力争取做得更好!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lqwer123456 发表于 2021-7-25 10:48
感谢分享!
18921730031 发表于 2021-7-25 12:53
范围查询的话 mysql底层会根据范围的大小来判定是否走索引或全表扫描 但其后面的字段就不会走索引了
like的话 如果通配符在所模糊查询字段后面的话 还是可以走索引
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 13:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表