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

轉載于:https://www.cnblogs.com/vanoraxnc/p/10379321.html