2017-08-21 60 views
-1

我有100M的記錄,像這樣一個InnoDB表:mysql select count(*)與哪裏掃描全表?

id name pid cid createdAt 
int char int int timestamp 

ID是PK和PID被索引:key

最常查詢select count(*) from table1 where pid='pid'

我的問題是,這是否查詢做一個全表掃描?

回答

0

count(*)很少有你想要的。

count函數對非空行進行計數,因此count(name)會計數其中name字段不爲空的記錄,例如。如果正在計數的字段未被編入索引,則會導致全表掃描。

count(*)的情況下,數據庫對至少有一個非空字段的記錄進行計數,即它排除所有字段爲空的記錄。這可能是你想要的,但大多數人不正確地使用這種形式,當他們想要統計所有的記錄而不管他們的內容。

對沒有數據庫特定語法的所有記錄進行計數的最有效方式是count(1)。這是有效的,因爲值1對於每個記錄都不爲空,並且不需要從數據庫讀取任何數據。

1

如果您想知道查詢的功能,請查看「解釋」計劃。

如果您想加快查詢速度,請在table1(pid)上創建一個索引。

查詢應該掃描索引而不是表格。