mysql优化 - mysql innodb 与 myisam 锁
问题描述
innodbinsert会加锁吗?如果会加锁,那意义是什么?在innodb中update和delete都会隐式添加排它锁,update table set ... where id in(1,2,3,4);请问排它锁是直接给这四条记录添加,还是按照id依次加锁,修改,commit;
myisamdelete,update 会隐式添加写锁吗?select 会隐式添加读锁吗?如果以两种情况会加,那都是表锁级别,那并发就特别差,对吗?
两个引擎的选择MyISAM:如果执行大量的SELECT,MyISAM是更好的选择,请问这是为什么?我实际测试360万条数据,都用到了索引的情况下select,innodb的效率高很多.
InnoDB:如果你的数据执行大量的INSERT或UPDATE,应该使用InnoDB表, 这是因为myisam表锁的原因?
问题解答
回答1:谢邀。
InnoDBInnoDB对INSERT可能只锁表头吧,总之不会锁全表的;UPDATE(如果没有FOR UPDATE或LOCK IN SHARE MODE)和DELETE在执行时会加写锁,有时就是锁全表,所以会影响并发性能,但这只是一瞬间的事,所以并发不高的情况下往往看不出来;一次UPDATE多行,肯定是多行一起锁,提交后一起释放的,因为MySQL要保证这条语句的原子性,当一条有主键冲突时,其他的也都不能提交了。
MySQLUPDATE和DELETE都会加写锁,而且锁全表;SELECT会加读锁,所以多个SELECT可以并发,但不能和UPDATE、DELETE并发;INSERT的加锁有点特殊,锁的强度可能介于读锁和写锁之间,与SELECT、INSERT可以并发。
最后,MyISAM就SELECT而言性能不会比InnoDB好很多,这还取决于行的存储方式,比如MyISAM的FIXED可能会比DYNAMIC快一些。另外,你的这个例子肯定会对InnoDB更有利些:如果改成一个非主键的索引,那么InnoDB未必会那么快;如果只SELECT id这一列,那么MyISAM未必这么慢。其中的道理可以搜一下聚集索引。
相关文章:
1. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)2. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题3. mysql多表联合查询优化的问题4. 数据库设计 - MySQL数据库主键问题5. MYSQL新建用户设置可以远程访问的问题6. linux - 为什么我在mysql的my.cnf下找不到bind-address?7. node.js - 我想让最后进入数据库的数据,在前台最先展示,如何做到?8. MySQL中的enum类型有什么优点?9. mysql字符串排序问题10. mysql 5.7单表300万数据,性能严重下降,如何破?
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)