實驗帖--MyISAM和InnoDB執行count()效率對比

衆所周知,mysql常用的引擎就兩個:MyISAM和InnoDB。
InnoDB有很多MyISAM沒有的東西,如支持事務、支持行鎖、支持MVCC…
但是
MyISAM在執行count()的時候是真的快,這時候的InnoDB簡直就是個弟弟。

對比如下:

實驗環境

mysql版本信息
在這裏插入圖片描述
表數據量354w+
在這裏插入圖片描述

實驗過程

1.不帶條件的count()

將數據表引擎切換爲InnoDB,花費102s左右
在這裏插入圖片描述
InnoDB執行不帶條件count(),第一次花費28s左右,之後平均1s左右
在這裏插入圖片描述

將數據表引擎切換爲MyISAM,花費53s左右
在這裏插入圖片描述

MyISAM執行不帶條件count(),平均0.00027s左右
在這裏插入圖片描述

2.帶條件的count()

MyISAM執行帶條件count(),平均1.3s左右
在這裏插入圖片描述
在這裏插入圖片描述

InnoDB執行帶條件count(),平均1.5s左右
在這裏插入圖片描述
在這裏插入圖片描述

實驗結論

不帶條件count():
MyISAM執行時間短到可以忽略不計
InnoDB第一次執行count()需要大概28s,之後每次平均在1s左右。

原因:
Myisam內置了一個計數器,直接將表的總行數存儲在磁盤上
InnoDB第一次需要全表掃描統計總行數,所以很慢。

帶條件count():
MyISAM和InnoDB執行時間差不多。

實驗所用命令:

//統計查詢 SELECT COUNT(*) AS tp_count FROM cmf_users_loginrecord where addtime between 1540111489 and 1543653889;

//查詢表結構 show create table cmf_users_loginrecord;

//查詢profiles是否開啓 show variables;

//開啓profiles set profiling = 1;

//查詢sql執行時間 show profiles;

//切換表引擎 ALTER TABLE cmf_users_loginrecord ENGINE=InnoDB;

爲什麼 InnoDB 不跟 MyISAM 一樣,也把數字存起來呢?

這是因爲即使是在同一個時刻的多個查詢,由於多版本併發控制(MVCC)的原因,InnoDB表“應該返回多少行”也是不確定的。 這和
InnoDB 的事務設計有關係,可重複讀是它默認的隔離級別,在代碼上就是通過多版本併發控制,也就是 MVCC
來實現的。每一行記錄都要判斷自己是否對這個會話可見,因此對於count(*) 請求來說,InnoDB
只好把數據一行一行地讀出依次判斷,可見的行才能夠用於計算“基於這個查詢”的表的總行數。
https://www.jianshu.com/p/ec52c5b72582

PS:
如何查看sql執行時間
1 show profiles;
2 show variables;查看profiling 是否是on狀態;
3 如果是off,則 set profiling = 1;
4 執行自己的sql語句;
5 show profiles;就可以查到sql語句的執行時間;

發佈了70 篇原創文章 · 獲贊 265 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章