Вы можете использовать простой Model.count
, он выполняет запрос на подсчет MySQL, что не должно дорого стоить.
Тогда есть активный кэш записи, который будет кэшировать результат запроса с помощью строки запроса в качестве ключа кэша, любые последующие запросы попадут в кэш, и он даже не выполнит запрос еще раз, он будет возвращен непосредственно из кеша запросов, поэтому я не думаю, что это было бы дорого.
EDIT:
О .size
, это способ для enumerable
, как массивы, чтобы использовать его вам нужно получить результирующий набор, чтобы вычислить его размер, что набор результатов дополнительные данные, которые вы не нужно, вы просто заинтересованы в счет, так что вы просто должны сказать, базу данных, чтобы принести счет, отсюда Model.count
, вот пример из приложения у меня уже есть:
User.count
(0.2ms) SELECT COUNT(*) FROM `users`
User.all.size
User Load (71.4ms) SELECT `users`.* FROM `users`
Обратите внимание на разницу в запросах , также разница в времени отклика, первый из них очень быстрый, потому что он уже кэширован.
Об индексе, в mysql (и я думаю, что любая уважительная база данных), любой первичный ключ должен быть уникальным и индексированным, потому что это первичный идентификатор записи, вам не нужно указывать его в миграции, создает рельсы автоматический прирост уникального первичного ключа, сам по себе, по умолчанию он даже не отображается в файлах миграции, чтобы отключить создание первичного ключа, вам нужно будет добавить дополнительную опцию id: false
, которая редко необходима.
что мы точно подсчитываем, количество записей внутри каждой таблицы? –
да, это правильно. – ahnbizcad
хорошо, есть несколько вариантов, либо кеширование страницы, либо сохранение этих подсчетов в какой-либо новой таблице, либо на самом деле счет, я не думаю, что это было бы так дорого, так как первичные ключи индексируются –