insert會加鎖嗎?如果會加鎖,那意義是什麼?
在innodb中update和delete都會隱含地加上排它鎖,
update table set ... where id in(1,2,3,4);請問排它鎖是直接給這四筆記錄添加,還是按照id依序加鎖,修改,commit;
delete,update 會隱含添加寫鎖嗎?
select 會隱式新增讀鎖嗎?
如果以兩種情況會加,那都是表鎖級別,那並發就特別差,對嗎?
兩個引擎的選擇
MyISAM:如果執行大量的SELECT,MyISAM是更好的選擇,請問這是為什麼?我實際測試360萬條數據,都用到了索引的情況下select,innodb的效率高很多.
InnoDB:如果你的資料執行大量的INSERT或UPDATE,應該使用InnoDB表, 這是因為myisam表鎖的原因?
大家讲道理2017-05-24 11:36:38
謝邀。
InnoDB
InnoDB對INSERT
可能只鎖定表頭吧,總之不會鎖定全表的;INSERT
可能只锁表头吧,总之不会锁全表的;UPDATE
(如果没有FOR UPDATE
或LOCK IN SHARE MODE
)和DELETE
在执行时会加写锁,有时就是锁全表,所以会影响并发性能,但这只是一瞬间的事,所以并发不高的情况下往往看不出来;
一次UPDATE
UPDATE
(如果沒有FOR UPDATE
或LOCK IN SHARE MODE
)和DELETE
在執行時會加寫鎖,有時就是鎖全表,所以會影響並發性能,但這只是一瞬間的事,所以並發不高的情況下往往看不出來;
UPDATE
多行,肯定是多行一起鎖,提交後一起釋放的,因為MySQL要保證這條語句的原子性,當一條有主鍵衝突時,其他的也都不能提交了。
MySQLUPDATE
和DELETE
都会加写锁,而且锁全表;SELECT
会加读锁,所以多个SELECT
可以并发,但不能和UPDATE
、DELETE
并发;INSERT
的加锁有点特殊,锁的强度可能介于读锁和写锁之间,与SELECT
、INSERT
UPDATE
和DELETE
都會加寫鎖,而且鎖全表;
SELECT
會加讀鎖,所以多個< code>SELECT可以並發,但不能和UPDATE
、DELETE
併發;INSERT
的加鎖有點特殊,鎖的強度可能介於讀鎖與寫入鎖之間,與SELECT
、INSERT
可以並發。 SELECT
而言性能不会比InnoDB好很多,这还取决于行的存储方式,比如MyISAM的FIXED
可能会比DYNAMIC
最後,MyISAM就快一些。 另外,你的這個例子肯定會對InnoDB更有利些:如果改成一個非主鍵的索引,那麼InnoDB未必會那麼快;如果只SELECT id這一列,那麼MyISAM未必這麼慢。其中的道理可以搜尋