MySQL小总结

参照两个博客做了一个关于MySQL底层原理的小总结
https://blog.csdn.net/qq_35571554/article/details/82392405

1.innoDB的存储文件两个, .frm(表的定义文件), .idb(数据文件)

2.innoDB有两种锁,表锁和行锁。命中索引才会使用行锁

3.MySQL四种隔离级别:读未提交,读已提交,可重复读,串行化。默认的是可重复读。oracle支持串行化和读已提交,默认读已提交

4.innoDB采用B+树,对id索引,叶子结点存储记录。如果用了辅助索引,副主索引的叶子结点就是主键,在通过主键找记录

5.MyISAM,三个文件 .frm,.MYD,.MYI。分别是表的定义文件,数据文件,索引文件。MyISAM只支持表锁,不支持事务,读取性能高。

6.MyISAM也是用的B+树,索引和数据存在不同的文件,叶子结点存的是对应数据的地址。是非聚簇索引。

7.innodb被广泛使用的原因是支持行级锁和事务

8.内存和磁盘以页为单位交换数据,数据不再内存时引发缺页异常。为了减少IO频率会预读(局部性原理)

9.不重复的索引unique,primary key(一张表只有一个primary key)。可以重复的普通索引

10.复合索引遵循最左原则

11.频繁进行数据操作insert update delete的表不要建立太多索引

12.聚簇索引与非聚簇索引:聚簇索引是按照索引顺序存储的(要设置自增的列作为主键),检索效率高,更新效率低;非聚簇索引的数据和索引是分开存放的,检索效率低,更新效率高(物理地址是没有顺序的,只能不断去磁盘上旋转读取)

13.复合索引中只有有一列含有null,这一列对复合索引就无效了

14.‘%a’是用不了索引,’a%'用得了

15.海量数据应该设计读写分离的数据库,但是要付出数据复制的成本

16.redis和memcache做缓存层可以提高数据库读写速度

17.原子性,一致性,隔离性,持久性 ACID(原子性和持久性通过redo实现,一致性通过undo实现)

18.redo主要是用于恢复,undo是用于回滚。undo,在操作数据前先将数据备份(备份的地方是undo log),当出错了或者rollback了就利用undo里面的数据将事务恢复到之前的状态。redo是备份新的数据,系统崩溃时通过redo将数据恢复。

19.脏读(A事务读到了B事务未提交的数据),不可重复度(两次读取的内容不一样),幻读(一个事务后一次查询看到了前一次查询没见过的行)。

https://segmentfault.com/a/1190000022635983

1.事务要么全部执行要么全部不执行

2.读锁(共享锁),非独占,可以多个并发事务锁定其资源。多个事务可以封锁共享页但是不能修改这页,页读取完毕了读锁直接被释放了。写锁(排它锁)如果有事务加锁了其他事务就不能加锁了,只有一个事务可以封锁这页,其他事务要锁释放了才能对这页访问,写锁要事物结束了才释放。

3.表锁开销小,冲突概率高,不会死锁。行锁开销大,冲突小,会死锁。

4.innodb buffer pool用LRU算法进行页面淘汰(一次全表扫描会把链表中的热数据全都刷掉,造成buffer pool污染,解决思路是在链表中搞一个midpoint,新插入的不插到首部,插到midpoint)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值