您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關MySQL中COUNT如何使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
COUNT(expr)返回檢索行中expr不為NULL的數量,其結果是一個BIGINT類型的值,如果沒有符合行,那么返回0。該處需要注意的是所謂的NULL指的是expr表達式,并不是所需要檢測的數據行的值,如果expr與數據列名相同,那么則返回該數據列不為NULL的數量。
對于傳統的存儲引擎InnoDb而言,存儲一個表的精確行數是十分困難的,因為多事務操作可能會并發,并且同時影響表的行數,所以為了避免并發線程查詢同一個表而得到不同的行數,InnoDb沒有對表的行數進行內部存儲,所以在InnoDb中,SELECT(*)僅僅返回當前事務所讀取到的行數。在MySQL5.7.18之前,InnoDb通過掃描聚簇索引來處理SELECTCOUNT(*)語句,5.7.18之后InnoDb使用最小且可用的第二索引來處理SELECTCOUNT(*)語句(除非查詢優化器提示使用一個其他的索引)。如果沒有第二索引,那么需要掃描聚簇索引。
如果索引記錄沒有全部在緩沖池中,那么處理SELECTCOUNT(*)語句是需要耗費一些時間的。如果需要追求一個快速的計算,那么可以在應用中單獨設計一個表用于在目標表進行插入或刪除操作時記錄其數據條數。然而,在大量的并行處理來update目標表的計數器表時會很難擴展。如果可以SHOWTABLESTATUS語句來獲取該信息。
InnoDb以相同的方式處理SELECTCOUNT(*)和SELECTCOUNT(1),并沒有性能上的差距。
對于MyIsam引擎,COUNT(*)在沒有WHERE子句的情況下是非常快的,因為在MyIsam引擎中,表的精確行數會被保存下來。如果MyIsam表的第一列被設置為非空,那么COUNT(1)具有同樣的優化效果(在對于100w條含有非空的簡單數據進行COUNT(*)與COUNT(1)的對比測試沒有明顯發現性能差異)。
COUNT(*)與COUNT(常量)都是查找表中記錄的行數,可以包含NULL數據;COUNT(列名)是查找表中該列非空的函數。
對于COUNT(*)相比COUNT(常量)而言,COUNT(*)是SQL92中定義的標準統計行數的語法,所以許多數據庫對其進行優化,對于MySQL而言,COUNT(常量)也是轉換為COUNT(*)執行的,標準語法優先使用COUNT(*),因為各個數據庫查詢優化器的優化策略肯定是從COUNT(*)開始的,阿里的SQL開發規范中也明確寫明要使用COUNT(*)。
關于MySQL中COUNT如何使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。