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優化器決定