天天看點

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

總結: 

MySQL兩種核心對比

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