小公主々 发表于 2021-5-1 23:40

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

本帖最后由 小公主々 于 2021-5-2 10:08 编辑

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


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


B-TREE树
4.B-Tree树定义


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

B+-Tree树
5.
结构特点:容纳节点更多。
数据特点:非叶子节点的子树指向P,小于K+1节点的值
算法特点:非叶子节点仅做索引,数据都保存在叶子节点中,这意味着非叶子节点可以存储更多的节点,且搜索会在叶子节点终结。当数据进行统计时,数据排序是有序的,那么查询到数据后不会再返回到非叶子节点中,而是直接从数据进行查询,即叶子节点之间有链指针。


Hash索引
6.Hash索引效率查询高,但是有缺点,首先要知道一个hash值对应多个数据值,且多个hash值跟数据是不相关的。
7.下图一三四点都是因为一个hash对应多个值导致。
8.第三点某些索引可以使用组合索引键,单部分索引也可以用来查询,而hash组合索引后得出hash值是不能用单个索引去查询的。
9.多个值时还是需要全表扫描


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时走全表扫描查询



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

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默认可重复读



扩展: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默认会创建隐形自增主键
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内部会生成一个隐藏主键(密集索引)
    非主键索引存储相关键位和其对应的主键值,包含两次查找
密集索引的定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引
稀疏索引:叶子节点仅保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息机器主键
实质就是密集索引查询数据时可以不用返回到上层节点,可以直接去定位同一行数据。而稀疏索引每次都需返回上层节点并重新开始索引查询。






【个人笔记】【剑指Java面试-Offer直通车】【一】【计算机网络知识】

















lqwer123456 发表于 2021-7-25 10:48

感谢分享!

18921730031 发表于 2021-7-25 12:53

范围查询的话 mysql底层会根据范围的大小来判定是否走索引或全表扫描 但其后面的字段就不会走索引了
like的话 如果通配符在所模糊查询字段后面的话 还是可以走索引
页: [1]
查看完整版本: [Java] 【个人笔记】【剑指Java面试-Offer直通车】【二】【数据库】