MySQL學習筆記 count的查詢

2022-05-18 22:17:39 字數 1650 閱讀 3949

count()計算乙個表的行數

select count(*) from t
在事務支援,併發能力,資料安全上innodb引擎表現都較myisam表現優良

innodb是索引組織表

主鍵索引樹的葉子節點是資料

普通索引樹的葉子節點是主鍵值

普通索引樹主鍵索引樹小很多

對於count(*)的操作,遍歷哪個索引樹得到的結果邏輯上是一樣的。因此mysql會找到最小的那課樹來遍歷

注意:

mysql>show table status   ##不能替代select count(*) from t

##因為show table status索引統計的值是取樣統計估算而來,誤差率較大

1.用快取系統支援(會導致邏輯上不一致

一種情況是,查詢到的100行結果了嗎有最新插入記錄,而redis的計數裡面還沒加1;

另一種情況是,查到的100結果裡沒有最新插入的記錄,而redis的計數裡面已經加了1;

時刻

會話a會話b

t1t2

redis計數加1;

t3讀redis計數;

查詢最近100條記錄;

t4插入一行資料r;

t5

1.此圖中,會話a在t2時插入一條資料r,會話b在t3查詢到資料r,但是沒有查詢到redis計數上加一,所以邏輯不一致

2.兩個系統,不支援一致性檢視

2.將計數儲存到資料庫裡(使用innodb的事務來更新資料)

解決的問題

快取系統裡面有丟失資料和計數不精確的風險

資料庫沒有崩潰丟失資料的風險,使用innodb的事務很好的解決了計數更新查詢的問題

時刻

會話a會話b

t1t2

begin;

表c中計數值加1;

t3begin;

讀表c計數值

查詢最近100條記錄

commit;

t4插入一行資料r

commit;

當處於innodb預設的可重複讀隔離級別下

count(*),count(主鍵 id)和count(1)都表示返回滿足條件的結果集的總行數

count(字段)則表示返回滿足條件的資料行裡面,引數「字段」部位null的總個數

count(主鍵id):innodb引擎會遍歷整張表,將每一行的id值取出返回給server層,判斷不為空,則按行累加(不一定走主鍵,哪張表小走哪張表,但速度還是沒有count()快,因為它自己還要取出值判斷,而count()不用判斷

count(1):innodb引擎遍歷整張表,但不取值。server層對於返回的每一行放乙個數字『1』進去,判斷不為空,按行累加

count(字段):

count(*):會被優化,不取出全部字段,直接按行累加(走的主鍵,主鍵不可能為空)

所以按照效率的排序:count(字段)盡量使用count(*)

mysql筆記系列 十二 count的執行過程

myisam 將乙個表的總行數存在了磁碟裡面,使用的時候直接讀出來,很快。如果有where 條件,就需要按行統計了,就不能那麼快 innodb則是將資料一條條讀出來統計,所以資料越多越慢。innodb這樣設計是因為事務,事務的併發版本控制,乙個事務中的查詢,只能對看到自己事務隔離級別的資料,也就需要...

mysql的count函式優化

mysql的count優化總體上有以下注意事項 1.任何情況下select count from tablename是最優選擇 2.儘量減少select count from tablename where col value 這種查詢 3.杜絕select count col from table...

MySql中的count 函式

1.count 函式是用來統計表中記錄的乙個函式,返回匹配條件的行數。2.count 語法 1 count 包括所有列,返回表中的記錄數,相當於統計表的行數,在統計結果的時候,不會忽略列值為null的記錄。2 count 1 忽略所有列,1表示乙個固定值,也可以用count 2 count 3 代替...