Mysql верхний предел для счета (*) - PullRequest
7 голосов
/ 12 декабря 2011

У меня есть запрос:

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

Если в таблице несколько миллионов записей, запрос выполняется очень медленно, хотя в столбце something есть индекс.Однако на самом деле меня интересует значение:

min(100000, count(*))

Так есть ли способ предотвратить подсчет строк MySQL, когда он уже нашел 100k?Я нашел что-то вроде:

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

Это намного быстрее, чем count(*), если в таблице несколько миллионов совпадающих записей, но count(*) работает намного быстрее, когда найдено менее 100000 совпадений.

Есть ли способ сделать это быстрее?

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

У меня нет баллов для комментариев, поэтому я публикую это как ответ ...

  1. Вы пытались использовать EXPLAIN , чтобы увидеть, включен ли ваш индексsomething на самом деле используется?Похоже, этот запрос выполняет сканирование таблицы .В идеале вы захотите увидеть что-то вроде " Extra : Использование где; Использование индекса".
  2. Из любопытства, является ли something пустым полем?

Помимо этого, возможно, оптимизатору запросов лучше справиться со следующим:

select count(*) as cnt
from table
where something > 123
having count(*) > 100000
0 голосов
/ 12 декабря 2011

Может помочь лучше использовать ограничение диапазона значений.

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

Другое дело, возможно, иметь счетчик триггеров обновлений.

...