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務必建好索引,否則鎖粒度較大,會影響並發。
總結: