Беспорядок времени запроса MySQL Rails

У меня есть запрос вычисления количества, который я выполняю тысячи времен в своем приложении для направляющих, однажды для каждого клиента в дб.

То, когда я работаю, запрос в моем клиенте 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 столбце в той таблице.

Кто-либо получил какие-либо предложения относительно того, почему это произошло бы?

Спасибо

5
задан johnnymire 29 January 2010 в 11:16
поделиться

4 ответа

Используйте 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;

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

4
ответ дан 15 December 2019 в 01:01
поделиться

Coveo - это поисковая система, которую мы в настоящее время устанавливаем для замены Google Mini , которая использовалась в течение ряда лет. Я просто указываю их как что-то, что нужно исследовать, так как я не использовал их достаточно, чтобы знать, насколько они хороши. Я просто знаю о головных болях с каждой, много головных болей.

-121--3357767-

Джошуа Блох (признанный эксперт по Java) фактически рекомендует такой подход в своей книге Effective Java 2nd Edition на стр. 17. конструктор или перечислительный тип.

-121--2995526-

Это также происходит в вашем приложении rails или это происходит только при запуске в консоли? Кроме того, вы используете такой клиент, как Aptana, или запускаете его в оболочке?

0
ответ дан 15 December 2019 в 01:01
поделиться

Какая это версия рельсов? В зависимости от вашей версии, и ваш код Ruby / Rails, вы можете кэшировать много данных, не используя его, и через некоторое время он должен сделать сборку мусора, прежде чем получать новые данные, которые могут объяснить задержку. Это предположение, разумеешься.

0
ответ дан 15 December 2019 в 01:01
поделиться

Разве не имеет смысла добавлять кэш счетчика в ассоциацию (читайте: добавьте email_campaign_report_opens_count к вашей модели Customer ) ? Конечно, вам нужно инициализировать счетчики во время миграции, но тогда это должно быть очень быстро, и вам даже не нужно прикасаться к связанной таблице во время движения по таблице клиентов.

0
ответ дан 15 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: