Вы поддерживаете фильтрацию в памяти или используете запросы SQL для большого количества записей в приложении ruby ​​on rails? - PullRequest
1 голос
/ 21 июня 2011

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

Какой лучший способ запустить такойзапрос в Ruby on Rails?

Как разработчики предпочитают фильтрацию в памяти или выполнение сложных запросов SQL?

Ответы [ 3 ]

7 голосов
/ 21 июня 2011

Лучше всего позволить базе данных выполнять свою работу.Просто напишите запрос с предложением where / join / etc.и используйте сортировку, чтобы вернуть только те записи, которые вам нужны.Возвращая больше записей и затем фильтруя данные в рельсах, вы тратите впустую количество данных по «проводу» (между БД и сервером приложений), а также памяти.Базы данных оптимизированы для такого рода вещей.При необходимости используйте индекс для таблицы.

Еще один похожий пост: http://www.mail-archive.com/rubyonrails-talk@googlegroups.com/msg13484.html

2 голосов
/ 21 июня 2011

Медленная часть веб-приложения - это почти всегда база данных.

  1. выполнение сложных запросов будет стоить вам немного времени, но предоставленные данные будут значимыми и не такими большими.

  2. Выполнение базовых запросов позволит вам получить большой набор данных, с которым вам придется иметь дело.Этот большой объем данных также может быть длинным для импорта.

Я бы придерживался 1, зная, что вы можете оптимизировать запросы и добавлять индексы.

1 голос
/ 21 июня 2011

Почти всегда вы должны использовать SQL для фильтрации вашего набора результатов.База данных намного более настроена на производительность, и сортировка в коде часто может привести к N + x запросам, которые могут снизить производительность.

Средство поиска, которое может выполнить что-то вроде того, что вам нужно, может выглядеть так:*

Article.where('id in (
                SELECT article_id
                FROM comments
                WHERE approved = ? AND public = ?
                ORDER BY count(article_id) DESC
                LIMIT 10 
              )', true, true)
...