select count 只統計不是null的列數,所以count(列名),count(常量),count(*)的區別就是:
count(列名)中的列可能是null,於是不被統計入內
其餘兩個倒是統計所有符合條件的行數,且是標準的統計行數的方法,mysql已經做了一些優化,所以推薦
區分為myisam和innodb兩種引擎的區別。myisam是表級鎖,且不支援事務,而innodb是行級鎖,且支援事務。
由於myisam是表級鎖,不會存在查詢的時候併發對錶行數的修改,故可以直接呼叫快取下的表的行數。
而innodb是會在查詢的時候,行數發生變化的,不可使用快取行數。就會涉及查詢的時候實時去掃表,innodb 8.0.13開始,掃表開始有一些有優化:
count(*)只關心條數,不關心內容,所以會選擇低成本的索引掃表。當語句中沒有where和group by條件時,innodb會使用聚簇索引(主鍵索引)和非聚簇索引(非主鍵索引)中的非聚簇索引。聚簇索引的葉子節點儲存證行記錄,而非聚簇索引只保留該行記錄的主鍵值。所以相比之下,非聚簇索引的成本低很多,mysql會優先選擇最小的非聚簇索引來掃表。因此建表的時候,除了主鍵索引,非主鍵索引也是很必要的。
以上優化的條件是當查詢語句中不存在where 和group by的時候
mysql官方文件是說innodb handles select count(*) and select count(1) operations in the same way. there is no performance difference.
count(字段)會判斷列值是不是null,所以效能會低於count(*)
細品SELECT COUNT語句
我們在運算元據庫時,統計數量函式count被經常使用到,今天我們就來細品select count函式 認識count 1 count expr 返回select語句檢索的行中expr的值不為null的數量。結果是乙個bigint值。2 如果查詢結果沒有命中任何記錄,則返回0。3 count 的統計結...
關於HIVE的SELECT count 優化
印象最深的是hive將表的大小作為了元資料儲存在了關聯式資料庫中。譬如在老版本中執行如下的語句 from base insert overwrite table user select 你會發現日誌的末尾會有 999 rowd loaded into table user 的字樣 代表有999條目記...
mysql技巧之select count的比較
在工作過程中,時不時會有開發諮詢幾種select count 的區別,我總會告訴他們使用select count 就好。下文我會展示幾種sql的執行計畫來說明為啥是這樣。1.測試環境 os linux db mysql 5.5.18 table innodb儲存引擎 表定義如下 2.測試場景與分析 ...