2015-10-08 3 views
0

Я хочу отображать количество напоминаний в очереди в качестве статистики на моем сайте. Эта статистика - это количество строк в моей таблице. То, что я делал в прошлом, - это отдельная таблица, которая кэширует номер. Таблица кэширования имеет только одну строку, а один столбец содержит количество строк в таблице напоминаний. Каждый раз, когда добавляется новое напоминание, у меня есть другой запрос, который увеличивает значение на единицу.Количество повторных подсчетов или кешей таблицы mysql

Я недавно включил функцию count() в свой проект. Мой вопрос: лучше ли выполнять функцию count() в таблице, чтобы отображать текущее количество напоминаний каждый раз, когда кто-то загружает страницу (статистика отображается в нижнем колонтитуле), или быстрее, чтобы этот номер уже был сохранен в другой таблице, так что Я просто читаю из этого стола? В какой момент будет быстрее использовать кешированное значение, а не функцию count?

+0

Насколько велики подсчеты? –

+0

Существует только 2000 строк, поэтому я понимаю, что это не имеет большого значения в любом случае. Мне интересно, какая разница для больших размеров таблиц. – blazerunner44

ответ

1

Как и в случае с большинством вопросов, связанных с оптимизацией, ответ: ну, это зависит.

Если ваша таблица использует тип таблицы myisam, то количество строк уже кэшируется в самой таблице и подсчитывается (*), где не будет прочитано это число.

Если вы используете движок innodb table и у вас много вложений и меньше выбираете, то сохранение номера счета будет дороже, чем подсчет строк. Если у вас слишком много вставок, то использование кешированного числа, вероятно, будет быстрее, так как innodb относительно медленнее на счетчике (*), где нет.

См. mysql performance blog on count(*) для получения более подробного разъяснения по innodb.

+0

Спасибо за ваш комментарий к движку MyISAM. Это то, что используют мои таблицы, но я не знал, что это кэширует ценность для меня. Я спрашиваю, что тогда отвечает на мой вопрос. – blazerunner44

0

Вы спрашиваете, лучше ли использовать функцию count? , с технической точки зрения, это лучший способ, но это всегда зависит от того, насколько велики ваши данные, вызывая подсчет каждой загрузки страницы, не очень хорошая идея, если вы обрабатываете большой объем данных, потому что это повлияет на рендеринг страницы, это сделает загрузку страницы слишком медленной в этом случае. Если вы подсчитаете небольшой объем данных, это будет хорошим и лучшим способом.

+0

В какой момент вы могли бы сказать, что лучше использовать кешированное значение, а не функцию count? – blazerunner44

+0

@ blazerunner44, используя кешированное значение, не требует, чтобы вы подсчитывали каждую загрузку страницы, потому что данные уже хранятся в кеше. – Japongskie

+0

Да, я знаю, что он не засчитывается каждый раз, когда страница загружается. Он считывает кешированное значение из отдельной таблицы каждый раз, когда загружается страница. – blazerunner44

1

Если вы думаете о кешировании строк, вы, вероятно, не должны, и вам, вероятно, это не нужно. Там является встроенный механизм

SHOW TABLE STATUS

Часть продукции этого запроса включает в себя:

Количество строк. Некоторые устройства хранения данных, такие как MyISAM, хранят точное число . Для других систем хранения, таких как InnoDB, это значение составляет в приближении и может варьироваться от фактического значения на целых 40 до 50%. В таких случаях используйте SELECT COUNT (*) для получения точного счета .

Значение строк NULL для таблиц в базе данных INFORMATION_SCHEMA.

Этот пункт также отвечает на ваш вопрос об эффективности SELECT COUNT (*) - на столах MyISAM это быстро, это не зависит от количества строк в таблице, так как внутренний счетчик используется.

Каким образом innodb отличается?

Innodb не сохраняет внутреннее количество строк в таблице, так как одновременно транзакции могут «видеть» разное количество строк в то же время. Чтобы обработать инструкцию SELECT COUNT (*) FROM t, InnoDB сканирует индекс таблицы , что занимает некоторое время, если индекс не полностью находится в буферном пуле. Если ваша таблица не меняется часто, использование кэша запросов MySQL является хорошим решением. Чтобы получить быстрый счет, вы должны использовать созданный вами счетчик таблицы , и пусть ваше приложение обновит его в соответствии с вставками и удалит его. Если достаточно приблизительного ряда , можно использовать SHOW TABLE STATUS.

Обратите внимание, что в этой части документации говорится о кешировании счета. Но вы заметите, что если есть индекс, который полностью покрывает таблицу, запрос count (*) остается быстрым. Поскольку у вас, естественно, есть первичный ключ и что первичный ключ, вероятно, будет в буфере, по крайней мере, частично влияние производительности будет небрежным.

Обратите внимание, что история совершенно другая в другой популярной базе данных с открытым исходным кодом Postgresql. Там count (*) замедляется пропорционально размеру таблицы. К счастью, в mysql это не так уж плохо.

В заключение: поскольку количество кешированных строк приблизительное, вы можете просто использовать статус таблицы шоу.

Смежные вопросы