mysql优化方案和四种事务隔离机制

Mysql  优化方案:

1. 创建合适的索引,但是不能盲目的添加索引。

2. 最好为每一个表建立一个int型的主键

3. 选用合适的数据类型,选用较为小的,较为轻量级的数据类型。Enum代替varchar,tinyint代替int等等。

4. 选择合适的存储引擎。MYISAM引擎适合大量查询的应用,但是对表的写操作不是很好,就是一个简单的update操作也会对整个表进行锁定,这样其他的线程将会无法访问。同时也不是事务安全的,不具有原子性。INNODB引擎支持行锁 ,所以在写操作的时候会很块,同时还是事务安全的,实现了四种事务隔离机制。

 

 

四种事务隔离机制:

serializable:现在开启两个连接(两个session,a和b),将session a的事务隔离级别设置成serializable,在两个session中都分别开启事务,开启之后,在session a中对一个表进行一个操作,那么这个事务就获取了对表的绝对操作权限(此时别的事务只能对这个表进行读操作,写操作将会被拒绝,直到session a中的事务提交),如果session b中的事务想查询表,那么可以允许,如果想添加修改等那么被拒绝,只有session a中的事务结束才可以。

repeatable read:  能保证重复读的一致性,但是会导致幻读,具体如下:打开两个session,并各自开启一个事务,mysql默认的事务隔离等级就是repeatable read。数据库中有一个表,初始的记录只有三行,在session a 的事务中查询这个表,出现三行记录,此时在session b中的事务中添加一行记录,session a中查询还是三行,session b事务提交了,现在的表实际的行数已经是四行了,但是此时session  a事务中查询还是三行记录,这就是所谓的保证了重复度的一致性。但是, 如果session a的事务中,对表的一条记录的某个值进行一次修改,修改之后再查询,那么就成了四行了,之前session b中添加的那个记录就出现了,那么,同一个事务的两次查询出现了不一样的结果,这就是幻读。

read committed:只要提交了,就能读,会导致多次的查询结果出现不一致。在这种隔离级别之下,一个事务中的查询会出现查询结果a,但是当另外一个事务中对数据表进行了修改,并提交事务之后,再次同样的查询,可能会出现查询结果b,a和b是完全不一样的。那么,这种数据的不安全性叫做不可重复读。

read uncommitted:只要修改了,就能读,会导致脏读的现象。在session a中修改了数据库表,但是并没有提交,但是在session b就可以直接查询到session a中修改后的结果b,这样就会导致一个问题就是,如果session a现在不想要那个对数据库表的操作了,执行了rollback。那么session b再次读的时候就会得到原本的结果a,那么两次查询的结果不一样,这就是脏读。


猜你喜欢

转载自blog.csdn.net/u010365819/article/details/80221579
今日推荐