MySQL中查詢表的總行數該用什麼命令?

2021-10-04 03:57:33 字數 2679 閱讀 1692

我們經常會使用到乙個sql語句,就是查詢某張表的總行數。常常使用的查詢命令有幾種,比如:select count(*) from tselect count(id) from t(id為主鍵)select count(1) from tselect count(某普通字段) from t以及show table status的rows欄位。然而卻不知道用哪種查詢方式最合適。接下來簡單介紹一下我們在mysql中查詢表的總行數時該用什麼命令。

在分析幾種查詢方式之間的不同之前,我們先來看下以select count(*) from t為例,不同儲存引擎之間查詢行數方式的不同。常見的儲存引擎有myisam和innodb。

innodb:每次我們需要查詢某張表的總行數時,都會遍歷整張表計算出結果。

myisam:每張表的總行數會記錄在磁碟中儲存,在我們需要查詢某張表的總行數時,命令會直接取出對應字段資訊。(不過需要注意,當命令查詢的不是表總行數,而是where查詢某些行時,也依然需要像innodb一樣遍歷整張表計算出結果)

很顯然,在錶行數較多時,myisam的方式是要比innodb更快的。

那麼,為什麼innodb不採用與myisam相同的處理方式呢?

本質原因在於innodb支援事務,我們可以看個具體的例子就明白了。

假設我們的表t中包含了100行資料,且有如下三個會話在做sql操作。(會話2與會話3是事務,會話1是普通語句)

先不管中間是怎樣的過程,我們看最後三個會話輸出的查詢結果。

如果是myisam儲存引擎,它是不支援事務的,查詢出的結果三個會話就都是102。

而如果是innodb儲存引擎,它是支援事務的,可重複讀是預設的隔離級別,所以查詢出的結果三個會話各不相同,會話1是101,會話2是100,會話3是102。

那麼,為什麼innodb不採用與myisam相同的處理方式呢?這就很明顯了。因為在相同時刻,innodb由於支援事務,所以可能會讀出的結果不同,

因此,innodb只能在需要查詢表總行數時去遍歷計算了。

myisam由於不存在這樣的問題,當然就可以把總行數儲存下來,每次需要時直接讀取就行了。

說回到開始說的幾個常用查詢語句,我們到底該用哪個查詢語句呢?我們以innodb引擎為例進行說明。

首先,我們要了解一下count()函式的作用,count()函式會判斷所查詢字段是否為null,會將非null的行累加起來,得到最終的行數值。

接下來分別分析這幾個常用查詢語句:

select count(字段) from t(欄位為非not null且非索引):伺服器會將字段返回給伺服器,伺服器判斷每乙個字段內容是否為null,如果不為null,則會計數加1,累加出來的結果即為語句結果返回。

select count(id) from t(id為主鍵):innodb會將每一行id返回給伺服器,伺服器判斷主鍵不可能為null,累加出來的結果即為語句結果返回。

select count(1) from t:innodb會遍歷整張表,不過不會取字段,也不會取值。而是伺服器放乙個數字1進去,並將累加出來的值作為結果返回。

select count(*) from t:優化器針對該語句做了優化,innodb不需要取字段給伺服器,而是伺服器直接計算行總數並返回。

由於count(*)count(1)都無需從innodb中取值,而是直接計算行總數,則兩者執行時間差不多。

count(id)會取出id值進行判斷,雖然主鍵值都不會為null,但執行時間會比前兩者長一些。

count(字段)count(id)判斷方式一樣,只是其不是索引,所以遍歷起來較count(id)會慢。

總結來說,四種常用查詢方式的速度順序為:count(字段)注意:select count(id) from t語句,雖然id為主鍵不可能是null值,理論上來說,mysql是無需乙個乙個再進行數值判斷的。然而目前mysql並沒有對此做優化,應該是在查詢總行數時,mysql就建議使用select count(*) from t,因此專門對count(*)做了優化。其餘的查詢就都按照需要什麼資料則取什麼資料這樣的原則統一處理。

show table status命令中的rows欄位也會顯示出表的總行數,但是該命令是通過取樣統計來計算出的表總行數,因此會有很大的誤差。作為參考值還可以,如果要使用精確值,就不推薦了。

簡單總結一下,我們在查詢某張表總行數時,如果需要知道大體行數,則可使用show table status的rows欄位檢視。如果需要知道精確行數,則需使用select count(*) from t命令來檢視。

mysql 表查詢結果 總行數計算

一般的查詢語句是這樣的 select id,name from systemevents where 1 1 limit 9,10 select from systemevents where 1 1 limit 9,10 這樣查詢出來的結果 要統計行數很麻煩 有乙個方法可以將上次查詢的結果 統計出...

查詢表的總行數的問題

查詢表的總行數的問題 delphi windows sdk api 在delphi中我查詢了資料表總數,要把這個值賦給乙個變數怎麼操作?不好意思我不能給分了.大家義務幫我下吧 是把 表的總行數 這個整型數賦值給變數是吧?資料集以adoquery為例 var rcount integer begin ...

查詢表的總行數的問題

查詢表的總行數的問題 delphi windows sdk api 在delphi中我查詢了資料表總數,要把這個值賦給乙個變數怎麼操作?不好意思我不能給分了.大家義務幫我下吧 是把 表的總行數 這個整型數賦值給變數是吧?資料集以adoquery為例 var rcount integer begin ...