Rails 3.1 - огромная разница во времени запросов между MySQL и PostgreSQL на Heroku - PullRequest
0 голосов
/ 10 января 2012

У меня есть запрос в моей среде разработки, который обычно занимает около 1,7 мс для запуска в базе данных dev mySQL. При поднятии до Heroku и PostgreSQL один и тот же запрос к одному и тому же набору данных занимает около 1,2 секунды !

SELECT distinct user_id, score, quality 
FROM `reports` 
WHERE (datetime_utc >= '2012-01-13 14:00:00' AND 
       datetime_utc <= '2012-01-14 14:00:00') 
ORDER BY score DESC, quality DESC LIMIT 20

Я создал составной индекс по оценке и качеству, который помог с версией SQL, но запрос, работающий на PostgreSQL, все еще очень и очень медленный. Мой первый инстинкт - проверить, что индекс действительно на стороне Heroku, но я не совсем уверен, как это сделать - в любом случае, я чувствую, что это больше связано с тем, что MySQL и PostgreSQL не делаю все по-другому.

Буду очень признателен за любые идеи или указатели!

Ответы [ 3 ]

2 голосов
/ 10 января 2012

Попробуйте этот измененный запрос:

SELECT user_id, score, quality
FROM   reports
WHERE  datetime_utc BETWEEN '2012-01-13 14:00:00' AND '2012-01-14 14:00:00'
GROUP  BY user_id, score, quality
ORDER  BY score DESC, quality DESC
LIMIT  20
  • Поскольку DISTINCT применяется последним, может быть медленнее, чем GROUP BY со многими не различимымистрок.Вам нужно проверить - с EXPLAIN ANALYZE.В противном случае результат будет таким же.

  • Незначительное упрощение предложения WHERE с BETWEEN.Удален нестандартный синтаксис MySQL.

  • Индекс на (score, quality) вряд ли будет использован. полезный индекс здесь (это должно иметь большое значение в большинстве сценариев):

CREATE INDEX reports_date_time_utc_idx ON reports (date_time_utc)

Важная частьиндекс.

1 голос
/ 10 января 2012

Поскольку Heroku не позволяет вам подключаться к базе данных, если у вас нет плана на сумму> 200 $ / месяц, вы можете попытаться получить локальную копию базы данных для локальной проверки.

heroku db:pull // Will give you a local copy of the db

Результат будет примерно таким:

Receiving schema
Receiving data
8 tables, 591 records
users:         100% |================================| Time: 00:00:00
pages:         100% |================================| Time: 00:00:00
comments:      100% |================================| Time: 00:00:00
tags:          100% |================================| Time: 00:00:00
Receiving indexes
Resetting sequences
1 голос
/ 10 января 2012

Может ли разница в производительности быть вызвана размером наборов данных между dev и heroku?

Имея индекс на оценку, качество не сильно поможет, если есть много строк, так как он все равно должен фильтроваться на основе datetime_utc.

Возможно, вы захотите рассмотреть индекс для datetime_utc, так как он должен сначала там фильтроваться.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...