MySQL千萬級數(shù)據(jù)count(*)查詢太慢怎么辦?優(yōu)化技巧分享
MySQL中 select count(*) 千萬級別數(shù)據(jù)查詢
我們在實際開發(fā)過程中常常會用遇到查詢表中數(shù)據(jù)總數(shù),或者攜帶where條件的查詢總數(shù),而使用count(*)的時候會很影響查詢效率的,
例如:
select count(*) from table select count(*) from table where id = '' and column = ''
在MySQL中不同的存儲引擎對于count(*)有不同的實現(xiàn)方式。
- MyISAM 引擎把一個表的總行數(shù)存在磁盤上,因此執(zhí)行count(*)的時候會直接返回這個數(shù),效率很高。
- InnoDB引擎在執(zhí)行count(*)時,需要把數(shù)據(jù)一行一行地從引擎中讀取出來,然后累計計數(shù)。
當然,如果MyISAM后面也加上where條件的話,MyISAM也沒有那么快,我們在實際開發(fā)中,多數(shù)都需要事務(wù),所以建表都會選擇InnoDB。
使用count(*) 的時候
1,一定需要走索引,能走輔助索引 (選擇表中列較短的創(chuàng)建一個普通索引) 就走輔助索引,不能走也建議創(chuàng)建一個輔助索引。
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
使用索引和不使用索引查詢數(shù)據(jù)真不是一樣的。
2,如果使用count(*)建議一定是單表查詢,所以建表的時候,希望有所考慮。
3,建議表中取消掉復(fù)合索引(組合索引) ,把復(fù)合索引拆解成普通索引(單列索引)

圖片中復(fù)合索引,可拆解成普通索引,這樣做的意義是,count(*) 在MySQL中會被進行優(yōu)化,會走索引較短的列進行查詢,如果是這種復(fù)合索引的話,我測試過3200W的數(shù)據(jù)大概需要120秒,而走單列索引的話只需要3秒。
建議需要使用count(*) 的話,用explain來查看是否走了索引,走了那一個索引,如果是復(fù)合索引,請修改成普通索引,在進行查詢
explain select count(*) from table explain select count(*) from table where id = '' and column = ''
以上是我測試通過,并且實際生產(chǎn)的優(yōu)化。
總結(jié)
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL中如何求平均值常見實例(AVG函數(shù)詳解)
MySQL avg()是一個聚合函數(shù),用于返回各種記錄中表達式的平均值,這篇文章主要介紹了MySQL中用AVG函數(shù)如何求平均值的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-11-11

