存儲引擎: 早期的時候,存在如何選擇MyISAM和Innodb? 現在,Innodb不斷地發展完善,成為了主流的存儲引擎。 因此5.5之後的mysql,無腦選擇Innodb即可。 MYSQL中的數據,索引以及其他的對象,是如何存儲的,是一套文件系統的實現。 MYSQL支持很多的存儲引擎,使用 SHO ...
存儲引擎:
早期的時候,存在如何選擇MyISAM和Innodb?
現在,Innodb不斷地發展完善,成為了主流的存儲引擎。
因此5.5之後的mysql,無腦選擇Innodb即可。
MYSQL中的數據,索引以及其他的對象,是如何存儲的,是一套文件系統的實現。
MYSQL支持很多的存儲引擎,使用
SHOW ENGINES
即可查到全部的引擎
MyISAM和Innodb的比較:
1.存儲文件的角度:MyISAM數據和索引分別存儲,數據是.myd,索引是.myi;Innodb數據和索引集中存儲為.ibd,不支持文件級別的移動
2.記錄存儲順序的角度:MyISAM順序存儲,直接在表末尾插入記錄;Innodb主鍵順序存儲,插入時需要排序操作,稍影響了效率
3.空間碎片的角度:MyISAM會產生;Innodb不會產生;空間碎片就刪除了以前的記錄,MyISAM將會空餘下來一些空間
通俗來講,就說原來存儲文件100K,我刪除了一部分記錄後還是100K
優化MyISAM的空間碎片:
OPTIMIZE TABLE XXX;
4.外鍵和事務的角度:MyISAM不支持;Innodb支持,保證數據的完整性
5.全文索引的角度:MyISAM不支持;Innodb新版本支持,但是不支持中文,所以很雞肋
6.鎖的角度:MyISAM表級鎖定;Innodb行級鎖定,表級鎖定,處理併發能力更強
總結:沒有特殊需求,採用Innodb,數據基本都是讀寫的情況下,可以考慮採用MyISAM
鎖:
避免資源爭用的機制功能,多個任務同時使用一個資源,對該資源產生爭用
資料庫中,多個任務對資料庫進行CRUD操作就是資源爭用
通俗解釋原理:在某個任務使用資源的時候,標識出來,其他任務就不能同時操作,需要等待或者放棄
基本流程:先嘗試加鎖,如果鎖定成功,那麼使用該資源,使用完畢後釋放;如果失敗,進入操作隊列,等待鎖釋放
鎖的類型:
共用鎖(讀鎖),排他鎖(寫鎖)
不同類型的鎖,導致併發操作是不一樣的
讀鎖:共用讀操作,阻塞寫操作,不能執行寫操作
寫鎖:寫操作執行的時候獨占資源,自己可讀可寫,其他任務不能讀也不能寫
MySQL執行任何SQL時,都會自動增加鎖定,常規操作的情況下,不需要手動管理鎖
這裡的鎖和上文存儲引擎的行鎖表鎖不一樣,是鎖具體的實現方式
表級鎖:操作會鎖定整張表,無論是共用鎖還是獨占鎖
行級鎖:操作會鎖定操作的記錄
鎖的語法:
表鎖:READ是共用鎖讀鎖,WRITE是獨占鎖寫鎖
LOCK TABLES [table-name] READ|WRITE; UNLOCK TABLES;
行鎖:第一個是共用鎖,第二個是獨占鎖
SELECT * FROM TABLE [table-name] LOCK IN SHARE MODE; SELECT * FROM TABLE [table-name] FOR UPDATE;
行鎖獨占鎖只鎖定了表的該行,其他任務可以讀,不能更新鎖定的行,行鎖不是精確到某一行,而是一個間隙鎖
這時候插入鎖定的行的條件的記錄也會失敗(比如鎖定ID小於20的行,插入ID18,也是鎖定的)