MySQL引擎区别Innodb vs MyISAM

MySQL是我们常用的数据库,它有两种不同的存储引擎,弄清楚两者之间的区别,才能够在选择时做到心中有数。我们先看结论:

InnoDB MyISAM
支持事务、外键 

不支持事、外键

聚簇索引  

非聚簇索引

不支持全文索引(5.6.4之后也支持了)

支持全文索引

支持到行锁

支持表锁

不保存表数据总条数

保存表数据总条数

读写阻塞与实务相关

读会阻塞写

 

 

 

 

 

 

 

 

 

 

 在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

 

 

因此在进行选择时可以有相应的取舍:

MyISAM

  • 不需要事务支持(不支持)
  • 并发相对较低(锁定机制问题)
  • 数据修改相对较少(阻塞问题),以读为主
  • 数据一致性要求不是非常高
  1. 尽量索引(缓存机制)
  2. 调整读写优先级,根据实际需求确保重要操作更优先
  3. 启用延迟插入改善大批量写入性能
  4. 尽量顺序操作让insert数据都写入到尾部,减少阻塞
  5. 分解大的操作,降低单个操作的阻塞时间
  6. 降低并发数,某些高并发场景通过应用来进行排队机制
  7. 对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率
  8. MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问

InnoDB 

  • 需要事务支持(具有较好的事务特性),默认单条SQL封装为一个事务
  • 行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成,如果是需要全表扫描,那么实际上就会锁定全表(例如:update table set address='a' where name like ‘%李%’)
  • 数据更新较为频繁的场景
  • 数据一致性要求较高
  • 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO
  1. 主键尽可能小,避免给Secondary index带来过大的空间负担
  2. 避免全表扫描,因为会使用表锁
  3. 尽可能缓存所有的索引和数据,提高响应速度
  4. 在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交
  5. 合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
  6. 避免主键更新,因为这会带来大量的数据移动

参考:

https://blog.csdn.net/xlgen157387/article/details/68978320

https://blog.csdn.net/qq_27607965/article/details/79925288

猜你喜欢

转载自www.cnblogs.com/shuhe-nd/p/10889488.html
今日推荐