浅谈MySQL存储引擎选择InnoDB与MyISAM的优缺点分析?
MyISAM引擎设计简单,数据以紧密格式存储,所以某些读取场景下性能很好。
但是MyISAM最典型的还是表锁问题,这样会导致长期处于"Locked"状态。而且数据恢复时间长,无事务等问题或短板。
虽然5.1之前MyISAM的读比Innodb快很多,但是在5.1之后,默认引擎已经变为Innodb。
Innodb读写有很大的提高,采用MVCC来支持高并发,针对行加锁,是使用最广泛的存储引擎。
图片来源:网络
官方建议尽量将MyISAM都换为Innodb。
mysql的innodb添加了事务为什么还会出现数据丢失问题?
会话的隔离级别设置为serializable的时候,其他会话对该表的写操作将被挂起;但是还是可以读取数据的,因此根据读取的数据做更新还可能会有问题。应用程序中为了防止核心数据被并发修改,一般在查询数据的语句中增加for update的选项,从数据库层面避免造成同一条数据被两个事务同时进行操作。
mysql的innodb存储引擎下,主键默认是按照自增的顺序排的吗?
默认楼主使用的是InnoDB存储引擎尽量使用业务无关的自增列作为主键,主要原因:
1. InnoDB数据是按照主键聚簇的,数据在物理上按照主键大小顺序存储,使用其他列或者组合无法保证顺序插入,随机IO(SSD的话影响不大)导致插入性能下降2.所有二级索引都存储了主键的,采用二级索引查询,首先找到的主键,然后通过主键定位数据,如果直接使用组合字段作为主键,会导致二级索引占用空间较大,bufferpool中存储的记录数较少,影响性能,而自增列只占4或者8个字节,代价非常小
MYSQL-Innodb下,update的并发是否会产生脏数据?
MySQL并发情况下更新数据,正常应该是不会新增脏数据。但不排除一种情况,那就是在程序逻辑是判断如果存在则更新不存在则新增数据。这种情况下如果没有唯一索引的约束,就会产生脏数据。
这种情况其实和并发情况下事务产生脏读类似。
并发情况下如果事务的隔离级别过低(未提交读);则有可能会出现脏读的情况,也就是一个事务读到了另一个事务没有提交的更新数据。也有可能撤销事务时把另一个事务的更新结果覆盖,也就是丢失更新。