一. 数据执行流程
二 索引原理
说一下innoDB的索引,B+树结构+
innoDB支持事物(ACID),支持行级锁。存储表结构的文件叫.frm,存储数据和索引的文件叫.idb.类似这种数据和索引在一块的就叫聚簇索引。而《数据库原理》种是这么定义的,聚簇索引的叶子结点存的数据块,非聚簇索引叶子结点存的是索引,指向数据块,如图
覆盖索引:创建的索引包含查询的索引。比方说一个表(table)中包含字段a(加索引),b(加索引),c(不加索引),select a,b from table 就用到了覆盖索引,select * from table就没有用到覆盖索引。
最左前缀原则:就是加了一个(a,b)的联合索引,select * from table where a=a 就用到了最左前缀原则,select * from table where b=b就没有用到
索引下推:减少回表次数,io次数。先过滤,然后返回数据。比方说 select * from table where a like 'a%' and age=10,不开启ICP时,先将a字段以a开头的全部数据返回,然后再根据条件过滤;开启之后,先一行一行的找,如果符合a字段以a开头的条件则会继续判断其余条件例如是否age=10,然后返回。对于innoDB只适用于辅助(二级)索引
辅助索引,回表
myisam不支持事物,但是速度快,只支持表级锁。存储表结构的文件叫.frm,存储数据.MYD,索引的文件叫.MYI
一般用在读写分离的时候,myisam作为从库用来读,innoDB用作主库,用来写
三 事务与锁机制
锁其实锁的就是索引,创建的时候如果创建了索引就用那个索引,如果没有的话就找一个唯一不重复作为索引,如果没有的话就自己维护一个索引。
事务并发问题
1.脏读 a读到了b回滚的数据
2.不可重复读 a读到了b更新的数据
3.幻读 a读到了b增加或者删除的数据
如何解决如上问题呢
事务隔离级别
1. 读未提交 1,2,3无法解决
2.读已提交 能解决脏读 ;基于MVCC
3.可重复读 能解决脏读,不可重读复读,无法解决幻读;但是innoDB都是可以解决的;基于MVCC;innoDB的默认
4.串行化 都能解决
MVCC:基于快照方式实现。
LBCC:给数据加锁方式实现。