2012-01-07 3 views
0

у меня есть около 5,00,000 пользователей в моей таблице, и каждый пользователь связан с некоторыми книгами (has_many)Каков наилучший способ ... учитывая производительность

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

Я не буду отображать всех пользователей на одной странице, они будут разбиты на страницы.

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

+0

Вы хотите отобразить 5 миллионов записей? –

+0

Вы ДОЛЖНЫ разделять данные на более мелкие куски. – methyl

+1

Вы действительно хотите отобразить всех пользователей и их книги на одной странице? – afaf12

ответ

0

Несколько мыслей -

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

Отсюда следует разбиение на страницы - чтение ограниченных записей на странице. Хотя это будет означать SQL-запрос на страницу, но все же оптимизирован. И, конечно, вы можете использовать кеширование запросов.

Лучшим вариантом может быть отображение алфавитного списка пользователей, не обязательно A-Z, но также как AB, AC, AD и т. Д. Таким образом, ваши посетители могут сразу перейти к определенному списку. Подумайте о добавлении разбивки на страницы, если количество пользователей в данном списке слишком велико.

Я не уверен, насколько важно, чтобы ваш сайт показывал последние обновления как можно скорее, но вы также можете подумать о создании XML-файлов, сколько вам необходимо, например, в алфавитном порядке и сгенерировать свои веб-страницы из XML файлы. Вы можете обновлять эти файлы XML один раз каждые 24 часа. Таким образом, минимальная загрузка БД.

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

Надеюсь, это поможет!

+0

Отправка, что многие записи по сети на машине, на которой запущен его код, плюс поражение памяти на этой машине, повлечет за собой гнев администраторов системы, резко замедлит работу систем и отбросит много процессора. Разбиение страниц с использованием смещений в записи базы данных - это единственное решение, которое будет хорошо масштабироваться. Даже синтаксический анализ 5 миллионов XML-записей будет медленным, даже если он разбит на более мелкие файлы. Хороший администратор базы данных мог бы помочь ОП. –

+0

@theTinMan, конечно, отправка этих многочисленных записей клиенту не является хорошим способом, и поэтому я предложил разбиение на страницы. Предложение для алфавитного списка состоит в том, чтобы предоставить альтернативный метод навигации. Я не думаю, что анализ XML-файлов будет медленным, если у вас есть логика, чтобы напрямую знать, какой XML-файл следует читать; вам не нужно читать все файлы XML последовательно – Abhay

+0

Я не уверен, кто проголосовал за вас, возможно, тот, кто не понимает, но ваш ответ разумный и продуманный, так что я сделал +1. –

2

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

  1. У вас может быть индексная страница для пользователей, в которых вы перечисляете всех пользователей. В соответствии с каждым пользователем вы можете иметь страницу «показать», где вы показываете книги пользователя. Это значительно упростит результирующие запросы к базе данных, так как вам нужно будет загружать только пользователей для индексной страницы и загружать только книги одного пользователя на свою страницу показа. Это означает, что никакие сложные объединения и не много данных каждый раз.

  2. Если вы действительно хотите показать несколько пользователей и их книги на одной странице, то, как и кто-то, упомянутый в комментариях выше, вам нужно использовать разбивку на страницы, скажем, загрузить 5 пользователей на страницу. Однако, чтобы добавить к этому, вам также нужно будет использовать активную загрузку, поскольку это может легко превратиться в проблему N + 1. Вы можете прочитать больше в «Eager loading of associations».

Возвращаясь к первому подходу, вы также можете использовать разбивку на страницы; Например, при перечислении пользователей или даже книг для пользователя.

+1

Как заявил оловянный человек в приведенных выше комментариях, это было бы не очень тяжело, если бы я отправил список 500 000 пользователей в одном запросы ответ Даже если я пойду вторым подходом, я все равно сделаю arounf 500,00 запросов DB для этой страницы – Ross

2

Запросы с большими смещениями неэффективны в MySQL; При оценке запроса со смещением 100000 MySQL должен фактически найти эти 100 000 строк и отбросить их, прежде чем он сможет найти десять строк, которые вы в итоге показываете.

Один из способов, чтобы дать подсказки для вашего приложения: вместо того, чтобы говорить на странице 10000, скажите, что это страница, где id > x, если вы сортировали в порядке первичного ключа.

Также важно иметь соответствующие индексы.

Существует хорошая статья под названием «Efficient Pagination Using MySQL» на percona.com с различными подходами для разбиения на страницы большими множествами.

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