2015-02-02 2 views
3

Существует страница, содержащая различные элементы из разных таблиц MySQL (новости, статьи, видео, аудио и т. Д.), Привязанные к определенному тегу (например, «экономика»).Разбиение страниц на страницы из нескольких таблиц

На данный момент из каждой таблицы извлекаются 100 строк, привязанных к тегу, а затем группируются и сортируются.

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

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

Что я могу использовать для этой цели? Я рассматриваю поисковую систему Sphinx, но я не уверен, хорошо ли это в этом случае или нет - мне нужно только запрашивать и сортировать, а не полнотекстовый поиск.

ответ

2

Sphinx - очень хорошее решение для вашего случая. Вы можете определить один индекс для всех типов вашего контента (новости, статьи, видео, аудио), просто добавьте поле «source_type», которое показывает исходную таблицу, например 1 - новости, 2 - аудио, 3 - видео и т. Д. И добавьте все поля, которые вы хотите использовать для фильтрации.

Если вы хотите найти все аудио с меткой "rock", вам просто нужно фильтровать поля "tag" и "source_type". Sphinx делает это намного быстрее, чем MySQL, особенно если у вас очень большой объем данных. Sphinx вернет вам только кучу основанных строк (это зависит от max_results в конфигурации sphinx).

В то же время сфинкс легко возвратит вас, посчитав все матчи очень быстрыми. Используя LIMIT и OFFSET в ваших запросах к Sphinx, вы можете делать разбивку на страницы.

Таким образом, вы можете получить идентификаторы объектов в MySQL db из Sphinx и после этого извлечь все необходимые данные из MySQL.

Я использовал этот сценарий в той же ситуации. И это обеспечивает большую эффективность.

+0

Евгений Солдатов, так как я понимаю фильтры Sphinx по некоторым полям («тег» и «source_type» в вашем примере) намного быстрее, чем MySQL. Это также верно, если эти поля имеют индексы? На всякий случай, если у вас есть какая-либо информация о таком сравнении, пожалуйста, поделитесь им. – Vasily

+0

По моему опыту, это быстрее. Особенно сфинксы делают это лучше всего, когда вам нужно подсчитывать все совпадения со многими фильтрами, возможно, с некоторой агрегацией (для разбивки на страницы). К сожалению, я не могу дать никаких ориентиров. Я использовал эту схему в бэкэнде для новостного мобильного приложения. Он имел около 1 тыс. QPS на одном экземпляре Sphinx и двух экземплярах MySQL. Объем данных составлял около 500к строк. –

+2

Sphinx не имеет понятия «индексы», как база данных, ее совершенно другая настройка. По сути, ВСЕ данные представляют собой большой индекс, структурированный таким образом, чтобы быстро отвечать на запросы. См. Http://en.wikipedia.org/wiki/Inverted_index – barryhunter

Смежные вопросы