1. 程式人生 > >InnoDB與MyISAM中的count(*)的執行效率比較

InnoDB與MyISAM中的count(*)的執行效率比較

今天同學們在群裡討論oracle的count(*)與count(1)的問題,正好提到mysql的情況。我突然想到自己遇到的問題:在myisam引擎執行count(*)速度非常快,而且執行速度與記錄條數無關,而innodb卻不是這樣,記錄越多,速度越慢。 

    於是做了一個實驗,在一個有8000W條記錄的innodb表執行了一下 select count(*) from table 。 果然一直等待,大概8分多後出來結果。馬上再次執行相同的語句,用時大約22秒。馬上執行第三次,還是約22秒。 

    於是我猜想innodb沒有把記錄數儲存起來,而是做了實時統計,所以導致速度比較慢。第二次、第三次相對較快是因為快取記憶體的原因。於是打電話諮詢DBA同學。經過DBA同學的專業解答,我明白了:我猜對了,呵呵。所以,以後要注意在innodb中count(*)的問題,儘量避免吧……除非能確保該表始終保持很少的記錄數。 


    另外,在網上查了一些資料: 

引用
InnoDB Pitfalls 
However, all is not rosy with InnoDB. Because of its transactional nature, it has bottlenecks of its own. On MyISAM, doing a query that does SELECT COUNT(*) FROM {some_table}, is very fast, since MyISAM keeps the information in the index. 

On InnoDB, this info is not stored in an index, and even the index and the data are kept in the same file. So, doing the same query on a table can incur a significant performance penalty. 

To check what overhead this has, I wrote a simple test benchmark code. I duplicated a client node table that has 20,243 rows from MyISAM to InnoDB. 

On a quiescent AMD 64 machine with MySQL server 5.0.24, doing a SELECT COUNT(*) FROM node takes 0.835 milliseconds on MyISAM, while on InnoDB it takes 12.292 milliseconds! 


記錄一下,innodb引擎的count(*)問題。

相關推薦

InnoDBMyISAMcount(*)的執行效率比較

今天同學們在群裡討論oracle的count(*)與count(1)的問題,正好提到mysql的情況。我突然想到自己遇到的問題:在myisam引擎執行count(*)速度非常快,而且執行速度與記錄條數無關,而innodb卻不是這樣,記錄越多,速度越慢。     於是做了一個

sql語句orunion all的執行效率比較

當SQL語句有多個or語句時,可以考慮使用union或者union all代替來提高速度。使用or的SQL語句往往無法進行優化,導致速度變慢。但這不是固定的,有時候使用or速度會更快些。具體情況還要經過測試為準。如果加索引的話,也可能實現速度優化。     實驗表格如下,實

oracle裡面的count(1)count(*)函式的執行效率比較

count(1),其實就是計算一共有多少符合條件的行。 1並不是表示第一個欄位,而是表示一個固定值。 其實就可以想成表中有這麼一個欄位,這個欄位就是固定值1,count(1),就是計算一共有多少個1. 同理,count(2),也可以,得到的值完全一樣,count('x'),c

MySql啟用InnoDB數據引擎簡介 以及 InnoDB MYISAM的區別和聯系

隔離級別 最終 全文索引 都是 後臺 isa llb ldb 優勢 1、存儲引擎是什麽?   MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,

Mysql 存儲引擎InnoDBMyisam的主要區別

sql mysq where條件 擴展 擴展名 sel 系統 sele sans innodb 支持事務功能,myisam 不支持。 Myisam 的執行速度更快,性能更好。 2、select ,update ,insert ,delete 操作 MyISAM:如果執行

select count(*)、count(1)、count(0)的區別和執行效率比較

rst 區別 如果 定性 count(0 決定性 計算 fir 執行 區別 執行效率比較 執行效率從高到低 count(*)=count(1)=count(0)>count(colFirst)>count(colLast) 1.由於count(*)的算法

MySQL count(*)、count(1)、count(column)的區別和執行效率比較

count(*)、count(1)、count(column)區別     count(column) 會忽略為 null 的列,其他兩個不會。 執行效率     它們三個的效率如何呢?網上說的各

mysqlInnoDBMyISAM的區別

兩者的區別: 1. InnoDB支援事務,MyISAM不支援,對於InnoDB每一條SQL語言都預設封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務; 2. InnoDB支援外來鍵,而MyISAM不支援。對一個包含外來鍵的InnoDB錶轉為MYI

MySQL資料庫 InnoDB MyISAM的區別及其應用場景

InnoDB 與 MyISAM 都是MySQL資料庫的引擎。 1.他們的區別分為五點: (1).事務處理: MyISAM是非事務安全型的,而InnoDB是事務安全型的(支援事務處理等) (2).鎖機制不同: MyISAM是

for-forEach-stream三種遍歷方法執行效率比較選用思考

想法 設計 實現 結論 建議 想法   在JDK-8中,新添加了很多的方法,比如說現在我所說的forEach,該方法是用於集合遍歷的,其方式相當於傳統的for迴圈遍歷方式,只是與其不同之處就在於採用了lambda表示式,因而在進行迴圈遍歷時程

Mysql 儲存引擎InnoDBMyisam的主要區別

MVCC ( Multi-Version Concurrency Control )多版本併發控制  InnoDB:通過為每一行記錄新增兩個額外的隱藏的值來實現MVCC,這兩個值一個記錄這行資料何時被建立,另外一個記錄這行資料何時過期(或者被刪除)。但是InnoDB並不儲存這些事件發生時的實際時間,相反它只

C#基礎-058 List集合、HashSet集合、HashTable集合、StringBuilderString執行效率比較

static void Main(string[] args) { ArrayList list = new ArrayList();

Select count(*)和Count(1)的區別和執行效率比較

 在MySQL中Count(*)或者Count(1)或者Count([列])或許是最常用的聚合函式。很多人其實對這三者之間是區分不清的。經常會看到一些所謂的優化建議不使用Count(* )而是使用Count(1),從而可以提升效能,給出的理由是Count( *)會帶來全表

對於SQLCOUNT(1)和COUNT(*)執行效率上的誤解

轉自:http://blog.itpub.net/26736162/viewspace-2136339/ 如題,SQL中COUNT(1)和COUNT(*)執行效率的高低,說法不一。不過本人認為二者執行效率是一樣的。 本文作如下闡述: 1、COUNT( )函式是資料庫(Ora

MySQL InnoDBMyISAM存儲引擎差異

vco 重建 lec insert 需要 系統文件 name 單個 master 前言:   之前簡單介紹過 MySQL 常用的存儲引擎,今天對兩個主流的存儲簡單分析下差異,書上沒有參考的筆試題解答註解; 差異:   MyISAM 只支持表鎖,不支持事務,表損壞

ArrayList 和 LinkedList的執行效率比較

bst 輸出 快捷 iteration sting 遍歷 面向對象 循環 集合 一、概念: 一般我們都知道ArrayList* 由一個數組後推得到的 List。作為一個常規用途的對象容器使用,用於替換原先的 Vector。允許我們快速訪問元素,但在從列表中部插入和刪

InnoDBMyisam的區別

選擇 映射 myisam 出現 壓縮 select 並發控制 spa 支持 如何選擇存儲引擎: 如果不在乎可擴展能力和並發能力,也不在乎崩潰後數據的所示問題,卻對innoDB的空間占用過多比較敏感,這種場合應該使用MyISAM。否則應該使用InnoDB。如果需要使用在線熱備

xlrd/xlwtopenpyxl的讀寫效率比較

word row 3.1 無法 想要 整體 clas pretty ring 之前寫過python中xlrd/xlwt與openpyxl處理Excel的文章,也提到過兩者的主要區別在於寫入操作,其中xlwt針對Ecxec2007之前的版本,即.xls文件,其要求單個shee

InnoDBMyISAM索引結構

image eight width nod 分享 tle isam mage col 事實證明,一知半解在面試的時候是回答不清楚的InnoDB與MyISAM索引結構

INNODBMyISAM兩種表存儲引擎區別

耗時 關系數據庫 data 條件 表空間 height size org lob mysql數據庫分類為INNODB為MyISAM兩種表存儲引擎了,兩種各有優化在不同類型網站可能選擇不同,下面小編為各位介紹mysql更改表引擎INNODB為MyISAM技巧。常見的mysql