MySQL简介

1,MySQL架构

MySQL简介_第1张图片

2,事务的ACID属性,由存储引擎实现,表锁,行锁依赖于引擎的实现方式,InnoDB,XtraDB实现了ACID

3,事务隔离级别

    1)Read Uncommited,未提交读,实际并不会比其级别性能好多少,一般不采用此级别,但是会产生:

        脏读:事务可以读取未提交的数据。

    2)Read Commited,提交读,大多数db的默认隔离级别(mysql不是),解决了脏读,但是会产生:

        不可重复读:一个事务在未提交数据时对其它事务不可见,导致(其它事务)读操作两次同样的查询,可能得到不同的结果。

    3)Repeatable Read,可重复读,解决了脏读,也保证在同一个事务中多次读取同样记录的结果是一致的(不可重复读),但是会产生:

        幻读:某个事务正在读取某范围内的记录时,另外一个事务在该范围内插入了新的记录,之前的事务再次读取时,就产生了幻行。

         InnoDb、XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读,也是MySQL默认的隔离级别。

    4)Serializable,可串行化,最高隔离级别,使事务串行执行,避免幻读问题。这种隔离级别会在读每一行数据时加锁,所以容易导致锁超时或竟争问题,实际应用中很少使用此级别,要在没有并发的情况下才会考虑使用。    

    备注:

        不可重复读与幻读的定义非常相似,但可以这么理解:

        1)不可重复读侧重于描述update的情况

        2)幻读侧重于描述insert/delete的情况

4,死锁

    是指两个或者多个事务在同一资源上相互占用,并请求锁定对方资源占用资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。

5,MySQL提供两种事务引擎:InnoDB,NDB Cluster

6,InnoDB采用两阶段锁定协议,在事务执行过程中,随时可以锁定,只有在执行COMMIT或ROLLBACK时才全部释放锁。

7,存储引擎选择:

    1)日志型应用,这类应用对insert的要求很高,使用MyISAM,Archive引擎开销低,insert速度非常快(只做Insert/Select操作,表级锁);另外,如果同时需要select数据,由于这种引擎是表级锁,所以性能会明显下降,可以采用主/备库的方式,将主库insert数据复制到备库进行select,或者对表进行日期命名,查询的时候查其它没进行insert的表tb_16_月_日;

    2)只读或大部份情况下只读,由于MyISAM(先将数据写入到内存,然后等待操作系统定期将数据写入磁盘)引擎产生数据丢失的情况比较严重,所以InnoDB优于MyISAM;

    3)订单处理,由于需要事务所以InnoDB;

    4)CD-ROM应用,MyISAM或MyISAM压缩表,只读,压缩节省空间,方便复制;

    5)大数据量,InnoDB 3-5TB/库,10TB选用数仓。


你可能感兴趣的:(MySQL简介)