MySQL兩種內核對比


MySQL內核

https://blog.csdn.net/baichoufei90/article/details/83504446

關鍵字:全文索引 索引外置

 

 兩種內核:MyISAM 和InnoDB

 

 區別

1.count(*)

MyISAM會存儲總行數,InnoDB不會存儲總行數,select count(*)時是一行一行進行掃描的,而MyISAM操作select count(*)時結果很快

實踐:數據量大的表,InnoDB就盡量不要使用select count(*)查詢,性能消耗大

備注:只有查詢全表時MyISAM才會直接返回結果,加where條件之后的話MyISAM和InnoDB原理相同

2.全文索引https://www.cnblogs.com/tommy-huang/p/4483684.html)

MyISAM支持全文索引,InnoDB5.6之前不支持全文索引

備注:數據量大並發量大時,不建議使用數據庫自帶的全文索引,應該使用索引外置的架構設計方法,MyISAM也不是最優選。

3.事務

MyISAM不支持事務,InnoDB支持事務

備注:事務具有commit,rollback這些崩潰修復能力;MyISAM在系統異常崩潰時可能造成文件損壞。但是事務很耗性能,影響吞吐量,所以盡量只對一致性要求較高的業務使用事務。

4.外鍵

MyISAM不支持外鍵,InnoDB支持外鍵

備注:數據量大並發量大時,都不建議使用外鍵,要通過應用程序保證數據的完整。

5行鎖和表鎖

MyISAM只支持表鎖,InnoDB還支持行鎖

備注:

MyISAM執行語句時,會對整個表加鎖,數據量大並發量大時,性能影響較大

InnoDB細粒度行鎖,在數據量大時,性能影響較小

實踐:select+insert時使用Myisam,因為Myisam在文件尾部順序增加記錄速度快;但是大部分是讀寫混合,數據量大時就使用InnoDB

坑:InnoDB的行鎖是實現在索引上的,而不是鎖在屋里行記錄上,如果沒有命中索引,就不能使用行鎖,將使用表鎖

1.5.2 示例

例如有用戶信息表如下,且無其他索引: 

t_user(uid, uname, age, sex) innodb;uid PK 

那么有如下結論:

update t_user set age=10 where uid=1; #命中索引,行鎖。

update t_user set age=10 where uid != 1; #未命中索引,表鎖。

update t_user set age=10 where name='shenjian'; #無索引,表鎖。

啟示:InnoDB務必建好索引,否則鎖粒度較大,會影響並發。

 

總結: 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM