2011-12-12 23 views
7

Ho una query:limite superiore Mysql per il conteggio (*)

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

Se la tabella ha pochi milioni di dischi, la query viene eseguita molto lento anche se non c'è un indice sulla colonna di something. Tuttavia, in realtà io sono interessato a valore:

min(100000, count(*)) 

Quindi non v'è alcun modo per evitare che MySQL da contare le righe quando già trovato 100k? Ho trovato qualcosa di simile:

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

E 'molto più veloce di count(*) se la tabella ha un paio di milioni di voci corrispondenti, ma count(*) corre molto più velocemente quando ci sono meno di 100000 partite.

C'è un modo per farlo più velocemente?

+0

darò per scontato che è un errore di battitura che un limite è '123' e l'altro è' 23'. – Kevin

+0

Lo è. Risolto, grazie. –

+1

Che tipo di colonna è 'qualcosa? Stai usando InnoDB? –

risposta

0

Potrebbe aiutare a utilizzare meglio la limitazione del campo di valori.

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

L'altra cosa potrebbe essere avere un conteggio di trigger di aggiornamento.

1

Non ho i punti di commentare, così mi distacco questa come una risposta ...

  1. Hai provato a usare EXPLAIN per vedere se è effettivamente utilizzato l'indice sulla something? Sembra che questa query stia facendo un Table Scan. Idealmente, vorrai vedere qualcosa come "Extra: Using where; Using index".
  2. Per curiosità, è something un campo nullable?

Per inciso, forse il Query Optimizer farebbe meglio con il seguente:

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