我知识架构中mysql

    技术2022-07-21  66

    一. 数据执行流程

    二 索引原理

    说一下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:给数据加锁方式实现。

    Processed: 0.009, SQL: 9