我有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'
我的問題是,這是否查詢做一個全表掃描?
我有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'
我的問題是,這是否查詢做一個全表掃描?
count(*)
很少有你想要的。
count
函數對非空行進行計數,因此count(name)
會計數其中name
字段不爲空的記錄,例如。如果正在計數的字段未被編入索引,則會導致全表掃描。
在count(*)
的情況下,數據庫對至少有一個非空字段的記錄進行計數,即它排除所有字段爲空的記錄。這可能是你想要的,但大多數人不正確地使用這種形式,當他們想要統計所有的記錄而不管他們的內容。
對沒有數據庫特定語法的所有記錄進行計數的最有效方式是count(1)
。這是有效的,因爲值1
對於每個記錄都不爲空,並且不需要從數據庫讀取任何數據。
如果您想知道查詢的功能,請查看「解釋」計劃。
如果您想加快查詢速度,請在table1(pid)
上創建一個索引。
查詢應該掃描索引而不是表格。