mysql之count(字段)、count(*)、count(1)區別

COUNT(字段名):返回SELECT語句檢索的行中值不爲NULL的數量。結果是一個BIGINT
COUNT(1):表示的是直接查詢符合條件的數據庫表的行數(會包含值爲NULL的行數)
COUNT(*):表示的是直接查詢符合條件的數據庫表的行數(會包含值爲NULL的行數),並且是SQL92定義的標準統計行數的語法,因爲是標準語法,所以MySQL數據庫進行過很多優化


SQL92:是數據庫的一個ANSI/ISO標準。它定義了一種語言(SQL)以及數據庫的行爲(事務、隔離級別等)

COUNT(1)和COUNT(*)區別

MySQL官方文檔這麼說:

InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

所以,對於count(1)count(*),MySQL的優化是完全一樣的,根本不存在誰更快!

依舊建議使用count(*),因爲這是SQL92定義的標準統計行數的語法


重點介紹count(1)count(*)到底是用哪個字段查詢?
首先看下錶結構和索引

所有索引,其中idx_name、idx_age 爲普通索引

數據


首先進行查詢
EXPLAIN SELECT COUNT(1) FROM USER 
EXPLAIN SELECT COUNT(*) FROM USER

查詢出的結果都是:使用了idx_age索引,並沒有使用id或者表中第一個字段




刪除idx_age索引,查詢結果如下:居然使用了idx_name索引



刪除idx_name索引,查詢結果如下:終於使用了主鍵id索引



總結如下:count(1)count(*)並不是獲取的主鍵id或者表中第一個字段的統計,而且根據mysql優化器決定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章