您好,登錄后才能下訂單哦!
MySQL中COUNT查詢函數如何使用,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先創建一個表,只有id,name,sex三個字段,使用存儲過程隨機插入100萬條數據:
select count(expr) from table;
可以看到count函數實際上需要傳入expr,這個expr一般取值有以下三個:
列名:會檢索對應列值不為NULL的條數。
*:查詢符合條件的行數,和列值是否為NULL無關,返回結果都會返回。
常量:查詢符合條件的行數,和列值是否為NULL無關,返回結果都會返回。
可以發現執行速度兩條SQL語句是相差無幾的,count(1)和count(*)都是查詢全表數據行數,可能網上很多言論會說count(*)其實走的就是count(1)查詢,所以使用count(1)查詢可以節省轉換時間,實際上無論count(*)還是count(1)完全一致,都是表示指定非空表達式,所以會查詢所有符合條件的行數。為什么我會說這兩個語句執行效果是一樣的?因為Mysql官方文檔寫了這么一句話:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
可能有人會納悶我們添加索引列目的不就是為了提高查詢效率?平時我們檢索數據屬于范圍查詢,查詢指定的數據,所以走索引可以提高查詢效率,但是count(id)選擇索引基數大的主鍵索引肯定效率更低。因為主鍵索引和數據文件存放在一起,所以通過主鍵id取條數會檢索數據文件,count(id)會檢索整張表,然后遍歷取到每一行數據的id,然后返回server層對每一行的id,不為空count就 + 1,而count(*)一樣全表檢索,但是不會取id值,因為在索引樹就可以得到結果,所以count(id)需要取到數據再過濾id為null的數據效率方面肯定是慢上不少的。
count(*)優化
count(*)和count(1)沒什么差別,但是執行時間都得1S多,而且數據量只是100萬條,所以我們肯定需要進行適當的優化。因為count(*)實際上查詢會使用最小字段的索引進行優化查詢,但是因為目前我們表中只有一個主鍵索引,剛才也說過count(id)效率比count(*)低,所以默認不使用索引查詢,我們可以使用explain測試下:
可以看到查詢沒有走任何索引,所以效率很低是必然的。而count(*)剛才說過會默認尋找最小字段的索引優化查詢,所以我們給表增加一個status字段,弄成tinyint類型,并且添加二級索引,然后測試count(*)執行時間:
count(col)
說完了count(*),我們知道了如果在需要返回全部行數時可以使用count(*),那接下來我們如果需要查詢姓名不為空的總行數怎么做呢?我們可以加個where很快實現:
很顯然,本次查詢走索引了,加速查詢的原因是什么呢?因為我們在name字段創建了一個二級索引,在無二級索引時,count操作只能全表檢索數據。當我們通過二級索引統計總條數,無需掃描數據文件,因為二級索引存儲的數據就是name字段的值與主鍵id值。所以在count(col)時就可以在字段上添加一個二級索引加快檢索速率。
count函數指定where條件
這里一樣得分兩種情況:count(*)和count(col)。
select count(*) from order_info where type = 0;
看完上述內容,你們掌握MySQL中COUNT查詢函數如何使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。