首頁  >  問答  >  主體

mysql優化 - mysql innodb 與 myisam 鎖

innodb


insert會加鎖嗎?如果會加鎖,那意義是什麼?
在innodb中update和delete都會隱含地加上排它鎖
update table set ... where id in(1,2,3,4);請問排它鎖是直接給這四筆記錄添加,還是按照id依序加鎖,修改,commit;

myisam


delete,update 會隱含添加寫鎖嗎?
select 會隱式新增讀鎖嗎?
如果以兩種情況會加,那都是表鎖級別,那並發就特別差,對嗎?

兩個引擎的選擇
MyISAM:如果執行大量的SELECT,MyISAM是更好的選擇,請問這是為什麼?我實際測試360萬條數據,都用到了索引的情況下select,innodb的效率高很多.

InnoDB:如果你的資料執行大量的INSERT或UPDATE,應該使用InnoDB表, 這是因為myisam表鎖的原因?

淡淡烟草味淡淡烟草味2681 天前842

全部回覆(1)我來回復

  • 大家讲道理

    大家讲道理2017-05-24 11:36:38

    謝邀。

    InnoDB
    InnoDB對INSERT可能只鎖定表頭吧,總之不會鎖定全表的;INSERT可能只锁表头吧,总之不会锁全表的;
    UPDATE(如果没有FOR UPDATELOCK IN SHARE MODE)和DELETE在执行时会加写锁,有时就是锁全表,所以会影响并发性能,但这只是一瞬间的事,所以并发不高的情况下往往看不出来;
    一次UPDATEUPDATE(如果沒有FOR UPDATELOCK IN SHARE MODE)和DELETE在執行時會加寫鎖,有時就是鎖全表,所以會影響並發性能,但這只是一瞬間的事,所以並發不高的情況下往往看不出來;

    一次UPDATE多行,肯定是多行一起鎖,提交後一起釋放的,因為MySQL要保證這條語句的原子性,當一條有主鍵衝突時,其他的也都不能提交了。

    MySQL
    UPDATEDELETE都会加写锁,而且锁全表;
    SELECT会加读锁,所以多个SELECT可以并发,但不能和UPDATEDELETE并发;
    INSERT的加锁有点特殊,锁的强度可能介于读锁和写锁之间,与SELECTINSERTUPDATEDELETE都會加寫鎖,而且鎖全表;

    SELECT會加讀鎖,所以多個< code>SELECT可以並發,但不能和UPDATEDELETE併發;

    INSERT的加鎖有點特殊,鎖的強度可能介於讀鎖與寫入鎖之間,與SELECTINSERT可以並發。 SELECT而言性能不会比InnoDB好很多,这还取决于行的存储方式,比如MyISAM的FIXED可能会比DYNAMIC
    最後,MyISAM就快一些。 另外,你的這個例子肯定會對InnoDB更有利些:如果改成一個非主鍵的索引,那麼InnoDB未必會那麼快;如果只SELECT id這一列,那麼MyISAM未必這麼慢。其中的道理可以搜尋

    聚集索引🎜。 🎜

    回覆
    0
  • 取消回覆