У меня есть запрос вычисления количества, который я выполняю тысячи времен в своем приложении для направляющих, однажды для каждого клиента в дб.
То, когда я работаю, запрос в моем клиенте MySQL с кэшем запроса отключил запрос, берет в последний раз, чем 1 мс.
Однако, когда я работаю, моя задача от консоли Rails с выводом запроса включила, я заметил, что после первых нескольких запросов, которые очень быстры, время внезапно поднимается меньше чем от 1 мс приблизительно до 180 мс для остатка от запросов.
Я уменьшил innodb_buffer_pool_size, чтобы видеть изменение в поведении, но ничего не заметил.
Вот вывод от консоли:
EmailCampaignReport::Open Columns (143.2ms) SHOW FIELDS FROM `email_campaign_report_opens`
SQL (0.3ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332330)
SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333333)
SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332661)
SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332326)
SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332665)
SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 336027)
SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333001)
SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 331983)
SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332668)
SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332316)
SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332325)
SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 331995)
SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 334007)
SQL (0.2ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333326)
SQL (0.1ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332998)
SQL (183.9ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 334673)
SQL (183.7ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 336751)
SQL (183.6ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 333334)
SQL (186.3ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332663)
SQL (183.7ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332328)
SQL (186.3ms) SELECT count(*) AS count_all FROM `email_campaign_report_opens` WHERE (customer_id = 332659)
Существует индекс на customer_id столбце в той таблице.
Кто-либо получил какие-либо предложения относительно того, почему это произошло бы?
Спасибо
Используйте awk
$ echo cd 'blah blah/thing/another space/' | awk '{for(i=2;i<NF;i++) $i=$i"\\"}1'
cd blah\ blah/thing/another\ space/
$ echo 'cd /Users/joeuser/bump bonding/initial trials' | awk '{for(i=2;i<NF;i++) $i=$i"\\"}1'
cd /Users/joeuser/bump\ bonding/initial\ trials
-121--2948924- Единственный способ предотвратить это - иметь хорошую систему аутентификации пользователя. За исключением этого, вы можете отказаться от него, используя cookies и Captcha .
-121--4780177-Почему бы не выполнить только один запрос?
SELECT customer_id, count(*) AS count_all FROM `email_campaign_report_opens` GROUP BY customer_id;
Если у вас так много записей, что вы беспокоитесь о том, чтобы вернуть их все, то делайте это партиями, но я просто не понимаю, почему вы действительно хотите выполнить этот запрос для каждого клиента.
Coveo - это поисковая система, которую мы в настоящее время устанавливаем для замены Google Mini , которая использовалась в течение ряда лет. Я просто указываю их как что-то, что нужно исследовать, так как я не использовал их достаточно, чтобы знать, насколько они хороши. Я просто знаю о головных болях с каждой, много головных болей.
-121--3357767-Джошуа Блох (признанный эксперт по Java) фактически рекомендует такой подход в своей книге Effective Java 2nd Edition на стр. 17. конструктор или перечислительный тип.
-121--2995526-Это также происходит в вашем приложении rails или это происходит только при запуске в консоли? Кроме того, вы используете такой клиент, как Aptana, или запускаете его в оболочке?
Какая это версия рельсов? В зависимости от вашей версии, и ваш код Ruby / Rails, вы можете кэшировать много данных, не используя его, и через некоторое время он должен сделать сборку мусора, прежде чем получать новые данные, которые могут объяснить задержку. Это предположение, разумеешься.
Разве не имеет смысла добавлять кэш счетчика в ассоциацию (читайте: добавьте email_campaign_report_opens_count
к вашей модели Customer
) ? Конечно, вам нужно инициализировать счетчики во время миграции, но тогда это должно быть очень быстро, и вам даже не нужно прикасаться к связанной таблице во время движения по таблице клиентов.