参照两个博客做了一个关于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)