并发数据库事务缺锁导致的数据不一致情况:丢失更新,脏读,不可重复读,幻读:https://www.cnblogs.com/yfdream/p/7842917.html
数据库隔离级别:https://www.cnblogs.com/ubuntu1/p/8999403.html
详解 MySql InnoDB 中意向锁的作用:https://blog.youkuaiyun.com/qq_41376740/article/details/82346255
redo和undo:https://blog.youkuaiyun.com/yu757371316/article/details/81081669
redo与binlog的区别?binlog用于主从复制用,它记录了数据库的所有操作;而redo与undo只是保证server crash后没有回刷硬盘的数据完整性,当数据sync回硬盘后,redo可以被覆盖掉。
MySQL Innodb的MVCC实现原理:https://www.cnblogs.com/chenpingzhao/p/5065316.html
MySQL两段加锁协议:https://my.oschina.net/alchemystar/blog/1438839
大总结(深入理解mysql四种隔离级别及底层实现原理(MVCC和锁)):https://www.jianshu.com/p/563612576e6e
索引:https://my.oschina.net/u/2607135/blog/2981054
InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读:https://blog.youkuaiyun.com/luzhensmart/article/details/88134189
sql优化:https://blog.youkuaiyun.com/yajie_12/article/details/79694861
联合索引:https://www.cnblogs.com/yulei126/p/6786161.html ;https://www.cnblogs.com/forcheryl/p/7389798.html
联合索引在使用的情况下效率比单一索引高,a,b,c会根据左前缀生成(abc),(ab),(a)索引
覆盖索引:https://www.cnblogs.com/happyflyingpig/p/7662881.html
explain执行计划:https://www.cnblogs.com/gdwkong/articles/8505125.html
Exists与In效率分析:https://www.cnblogs.com/tiantiansunny/p/3555986.html
mysql的in查询是可以用到索引吗:https://blog.youkuaiyun.com/LJFPHP/article/details/89156326
or与in的效率比较:https://blog.youkuaiyun.com/w605283073/article/details/93774332
in会对in中的数据进行排序然后使用二分查找,所以时间复杂度是logn而or是n
MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!:https://www.cnblogs.com/williamjie/p/11192821.html
profiles可以查看sql执行的io时间,cpu情况;加锁时间等
分布式 2PC/3PC/TCC
老生常谈——利用消息队列处理分布式事务:https://www.cnblogs.com/rjzheng/p/10115798.html
总结:
两段加锁协议?
根据两段加锁协议,在rc下s锁select后会马上释放,但在mysql实现中遵循二段加锁协议(2PL),rc下s锁会在事务提交或回滚时释放。
rc和rr隔离级别的差别?
rc下的mvcc会在每次select时生成快照,可以读到最新的提交数据,但不能保证重复读和消除幻读;rr下的mvcc会在第一次select时生成快照,所以可以保证重复读和消除幻读。rc通过加x或s锁可保证重复读,但不能保证消除幻读。rr下加x或s锁可以保证消除幻读,因为默认开启gap锁。
丢失更新问题?
第一类丢失更新是事务rollback导致的,现在数据库保证无论在哪种隔离级别下都可以保证消除第一类丢失更新。
无论哪个隔离级别都不能解决第二类丢失更新(s隔离级别使用lock in share容易出现死锁,例下面),数据库并不解决第二类丢失更新,所以需要我们自己从业务上去保证,有如下两种方法:
1、悲观锁:select…for update 在读取时给记录加锁,在事务结束后再释放锁;
2、乐观锁:通过给记录增加版本号,使用CAS原理解决。
事务A:select * from TA WHERE id = 1; update TA SET name=1 where id=1;
事务B:select * from TA WHERE id = 1; update TA SET name=2 where id=1;
上面的情况在s隔离级别会出现死锁,因为select加了共享锁。CHAR和VARCHAR效率
查询效率varchar高于char(因为varchar占用空间少,减少io);插入修改效率char高于varchar,因为varchar是变长的。
int(3)与int(11),int[M]代表什么?
M代表显示的长度,当列设置为FULLZEOR时,前面会补0显示
myI为什么读比inodb快(JD面试题??)
inodb要维护MVCC,inodb是聚簇索引要进行二段IO
char和varchar的区别,其实在大数据下varchar的查询效率是比char高的;插入char快