2011-12-12 94 views
7

我有一個查詢上限:MySQL的COUNT(*)

select count(*) from `table` where `something`>123 

如果表中有幾百萬條記錄,查詢運行,即使有上something列的索引很慢。然而,事實上我很感興趣的值:

min(100000, count(*)) 

那麼,有沒有辦法阻止MySQL的計數,行,當它已經找到10萬?我發現這樣的:

select count(*) from (select 1 from `table` where `something`>123 limit 100000) as `asd` 

它比count(*)快得多如果表中有幾百萬的匹配項,但count(*)運行速度更快,當有較少的超過10萬輪的比賽。

有沒有辦法更快地做到這一點?

+0

我會認爲這是一個錯字一個限制是'123',另一個是'23'。 – Kevin

+0

是的。修正了,謝謝。 –

+1

什麼樣的列是'東西'?你在使用InnoDB嗎? –

回答

0

可能有助於更好地使用值範圍限制。

select count(*) - (select count(*) from t where something <= 123) as cnt 
from t 

另一件事可能是更新觸發器計數。

1

我沒有發表意見的點,所以我張貼此作爲一個答案......

  1. 您是否嘗試過使用EXPLAIN,看看實際使用您的something指數?這聽起來像是這個查詢正在執行Table Scan。理想情況下,您將希望看到類似「Extra:使用where;使用索引」。
  2. 出於好奇,是something一個可爲空的字段?

順便說一句,也許是查詢優化器將與下面做的更好:

select count(*) as cnt 
from table 
where something > 123 
having count(*) > 100000