存盤引擎:
早期的時候,存在如何選擇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,也是鎖定的)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/72697.html
標籤:MySQL
上一篇:mysql-調優
