数据库资料收集

基本使用

MYSQL学习心得
MySQL查询语句练习题

事务

事务并发、事务隔离级别
补:
A.丢失更新:A更新记录,B更新记录,A提交更新,B回滚,两次更新操作都丢失(回滚一个事务时,把其他事务已提交的更新数据覆盖)。
B.脏读:A更新记录,B查询记录,A回滚,B数据不真实(一个事务读到另一个事务未提交的更新数据)。
C.不可重复读:A查询记录,B更新记录并提交,A查询记录,数据变化了(一个事务读到另一个事务已提交的更新数据)。
D.覆盖更新:A更新记录并提交,B更新记录并提交,A查询更新结果,数据变化了(一个事务覆盖另一个事务已提交的更新数据)。
E.虚读(幻读):A查询结果集,B删除/添加记录并提交,A查询结果集,结果集中有以前没有的数据或者以前有的数据消失了

在上图显示的事务隔离级别可能导致的并发问题中,不可重复读和覆盖更新是针对已提交更新而言的,若B未提交更新,只有未提交读会导致并发问题。同理,幻像读是针对已提交更新而言的,若B未提交删除/添加操作,只有未提交读会导致并发问题。
可重复读的实现是对于读出的记录,添加共享锁直到transaction A结束。其它transaction B对这个记录的试图修改会一直等待直到transaction A结束。应该补充的一点是:若transaction B需要更新记录,期间transaction A需要读取记录,如果transaction B直接释放写锁,transaction A可以读取到提交的更新,这就违反了可重复读的定义,因此transaction B需要添加写锁直至事务结束(提交),之后transaction A才可以读取。简单来说,事务需要读取记录时,添加共享锁直到事务结束;事务需要更新记录时,添加写锁直到事务结束。
已提交读的实现是在transaction A中读取数据时对记录添加共享锁,但读取结束立即释放。其它transaction B对这个记录的试图修改会一直等待直到A中的读取过程结束,而不需要整个transaction A的结束。所以,在transaction A的不同阶段对同一记录的读取结果可能是不同的。transaction B事务需要更新记录时,添加写锁直到transaction B结束。
数据库事务简介
Mysql事务原理(一)
Mysql事务原理(二)
关于innodb中MVCC的一些理解
补:
MVCC主要是为了解决两个问题:写不阻塞读与读一致性。MVCC主要适用于可重复读事务级别(只能读取在它开始之前已经提交的事务对数据库的修改,在它开始以后,所有其他事务对数据库的修改对它来说均不可见)。理想的MVCC难以真正在实际中被应用,Innodb只是借了MVCC这个名字,提供了读的非阻塞而已,并没有实现核心的多版本共存,undo log中的内容只是串行化的结果,记录了多个事务的过程,不属于多版本共存。

索引

MySQL索引背后的数据结构及算法原理
补:
数据库索引使用B+树而不是红黑树的原因:
索引以文件形式存储在磁盘上->磁盘预读原理->节点大小设为一个页->确保一个节点一次I/O->节点出度大,树高度小,可减少I/O次数。
MySQL使用全文索引
位图索引

调优

陈皓 - MYSQL性能优化的最佳20+条经验
Mysql性能调优
补:
1、编码角度:存储引擎、ORM、变量代替数据库函数、批处理/预编译。
2、表字段角度:enum、NOT NULL、尽可能少列、固定长度、把IP地址存成UNSIGNED INT。
3、查询结果角度:随机行、返回必需字段、只需一行时使用limit 1、使用exists代替in。
4、查询过程角度:为搜索字段建索引、为join字段建索引、explain。

显示 Gitment 评论