2011-12-12 18 views
7

Tengo una consulta:límite superior de Mysql para la cuenta (*)

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

Si la tabla tiene pocos millones de registros, la consulta se ejecuta muy lento a pesar de que hay un índice en la columna something. Sin embargo, de hecho estoy interesado en valor de:

min(100000, count(*)) 

Entonces, ¿hay alguna manera de prevenir MySQL de contar filas cuando ya encontró 100k? He encontrado algo como:

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

Es mucho más rápido que count(*) si la tabla tiene unos pocos millones de entradas coincidentes, pero count(*) corre mucho más rápido cuando hay menos de 100000 coincidencias.

¿Hay alguna forma de hacerlo más rápido?

+0

Vamos a suponer que es un error tipográfico que un límite es '123' y el otro es' 23'. – Kevin

+0

Lo es. Reparado, gracias. –

+1

¿Qué tipo de columna es 'algo'? ¿Estás usando InnoDB? –

Respuesta

0

Podría ayudar a hacer un mejor uso de la limitación del rango de valores.

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

La otra cosa podría ser tener un conteo de disparadores de actualización.

1

que no tienen los puntos a comentar, así que estoy publicando esto como una respuesta ...

  1. ¿Ha intentado utilizar EXPLAIN para ver si en realidad se está utilizando su índice en something? Parece que esta consulta está haciendo un Table Scan. Idealmente, querrá ver algo como "Extra: Utilizando where; Using index".
  2. Por curiosidad, ¿es something un campo anulable?

Como acotación al margen, tal vez el optimizador de consultas haría mejor con lo siguiente:

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