普通索引和唯一索引区别
普通索引:普通索引支持change buffer(内存更新),也就是说普通索引更新的时候会把相关更新命令缓存在change buffer里边,当查询相关数据会进行merge持久化到硬盘的操作。
适用场景:写多读少
唯一索引:唯一索引每次都要进行索引的唯一性校验,当然这个查询唯一性的操作还是比较快,但是每次操作都要进行IO操作,这个过程效率比较低。在进行数据库设计中,应尽量使用非唯一索引。
redo log 和bin log 区别
redo log: redo log 是innodb数据库引擎独有的,其它引擎没有。redo log采用循环写的方式记录事务的更改状态,当发生宕机情况可以从redo log中恢复事务,从而保证了事务的持久化。
bin log: bin log 是MySql内部实现的,记录了对数据库操作的具体内容。如:数据的SQL语句还可以记录数据更改前和更改后的语句。查询语句是不记录的。bin log 可以实现数据库的恢复。
利用redo log 和 bin log 实现MySQL二阶段提交,保证了MySQL数据恢复的一致性。
join使用
MySQL5.5之后对join查询进行了优化,引入了Nested-Loop Join3种算法。
Simple Nested-Loop Join:SNLJ,简单嵌套循环连接
Index Nested-Loop Join:INLJ,索引嵌套循环连接
Block Nested-Loop Join:BNLJ,缓存块嵌套循环连接
SNLJ 暴力查询,驱动表匹配记录被驱动表记录!
INLJ 驱动表匹配记录索引高度!
BNLJ 驱动表匹配记录放在Join Buffer,被驱动表遍历匹配Join Buffer记录。索引Join Buffer记录越多,被驱动表遍历次数越少。
间隙锁
lock in share mode 因为覆盖索引故没有锁主键索引,如果使用for update 程序会觉得之后会执行更新操作故会将主键索引一同锁住。
唯一索引只有在值存在时才是行锁,值不存在的话,还是会变成间隙锁。
非索引字段进行update或select … for update操作,代价极高。所有记录上锁,以及所有间隔的锁