Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
Добрый день, не хочу ошибиться на начальном этапе, помогите плиз Есть новостной сайт Объем таблицы новостей - 1,5 млн записей. Сайт довольно нагруженный переделываем структуру базы Я хочу разбить таблицу с новостями на две news - хранится только НЕ вариативная информация (дата новости, количество просмотров, author_id, rubric_id и т.д.) news_articles - хранится заголовок, тело новости и т.д., а также news_id (связь с таблицей news) Таблицу news шардирую по createdAt (т.к. в каждом запросе будет order по дате) Таблицу news_article шардирую по Id На главной странице для формирования ленты последних новостей делаю выборку по news, выбираю множество id пусть с limit 50, а для получения заголовков выполняю второй запрос (SELECT header FROM news_articles WHERE news_id IN (множество полученых id в прошлом запросе))) Запрос получения id из таблицы news формируется динамически. Т.е. мне нужно выбрать id по какой-то определенной рубрике, либо для другого блока только с комментариями, в третьем блоке сортировать по дате, а в четвертом - по просмотрам Вычитал, что такая таблица должна быть без вариативных полей, для максимальной выборки. ВОПРОСЫ 1) Насколько так правильно делать? Хочется добиться максимальной производительности 2) По такому принципу хочу формировать все блоки на главной, смущает, что news_id IN (...) может быть много параметров - до 50 или даже 100, т.е. news_id IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?...) Это не проблема? 3) Может посоветуете более оптимальные варианты 4) Чтоб не выполнять второй запрос можно header вставить в news, но это varchar. Я так понимаю сразу упадет производительность, т.к. это вариативное поле, да и объем таблицы сразу существенно возрастет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 10:22 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
snksnk, надо не бояться количества таблиц, хоть сотня, есть такое понятие - сравочник, все темы в него, есть такое понятие таблица связь, связывает темы и сами новости. (это как пример) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 10:41 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
спасибо за ответ меня не пугает количество таблиц, меня больше интересуют те вопросы о которых я спросил, особенно 2 и 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 11:02 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
snksnkспасибо за ответ меня не пугает количество таблиц, меня больше интересуют те вопросы о которых я спросил, особенно 2 и 4 запросы будут следовать из структуры базы, структура из назначения таблиц. поэтому эти вопросы ещё рано задавать как только сформируется стуктура - ответы будут найдутся сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 11:36 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
Всего-то 1,5 млн записей. Как-то не вижу смысла в разделении таблиц. 1,5ляма например по 2кб текста (а это уже прилично текста) - всего-то 3 гб данных. При том text'ы хранятся отдельно, так что сама табличка совсем маленькая. И дикого роста не предвидится. Внятно проставить индексы и всё. Поскольку ожидается большая часть нагрузки на запросы по последним дням - партицировать по месяцам можно. Не забудьте только в запросы проставить условия, явно отсекающие ненужные партиции. Насколько понимаю специфику новостных сайтов - там чуть менее чем вся нагрузка - это чтение от преимущественно анонимных пользователей. nginx + memcache/redis для кеширования страницы целиком вовсе минуя бекенд? Кеширование почти целиком + SSI для редких динамических блоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 11:50 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
как-то уходим в глубокую теорию. Я постарался расписать задачу, которая стоит, а также исходные данные и вариант своего решения (своей структуры основной таблицы). Меня интересует нормально ли такое решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 11:52 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
Melkij, о, спасибо уже по делу. Да кеширование будет, это уже другой вопрос Вы говорите, что не видите смысла разделять таблицы. Т.е. тексты материалов, заголовки и служебную информацию (дата новости, id рубрики и т.д.) хранить в одной таблице? Сейчас они как раз и хранятся в одной таблице. я и хочу их вынести отдельно. Вот только нужно ли выносить заголовки или varchar можно оставить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 11:56 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
snksnk, вот я и не вижу смысла, зачем делить таблицу на две? Их потом джойнить надо, кросстабличных индексов нет, так что ещё и индексировать сложнее становится. Проблем добавится много, а что взамен - неясно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 12:21 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
snksnkДобрый ыдень, не хочу ошибиться на начальном этапе, помогите плиз Есть новостной сайт Объем таблицы новостей - 1,5 млн записей. Сайт довольно нагруженный переделываем структуру базы Я хочу разбить таблицу с новостями на две news - хранится только НЕ вариативная информация (дата новости, количество просмотров, author_id, rubric_id и т.д.) news_articles - хранится заголовок, тело новости и т.д., а также news_id (связь с таблицей news) Таблицу news шардирую по createdAt (т.к. в каждом запросе будет order по дате) Таблицу news_article шардирую по Id . чего ты делаешь с таблицей news? лучше обратись к профессионалам, не смеши людей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 12:21 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
1) Насколько так правильно делать? Хочется добиться максимальной производительности когда проектируют бд, не думают о производительности, думают о правильной структуре только. 2) По такому принципу хочу формировать все блоки на главной, смущает, что news_id IN (...) может быть много параметров - до 50 или даже 100, т.е. news_id IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?...) Это не проблема? это не проблема проектировани бд, это проблема написания запросов. 3) Может посоветуете более оптимальные варианты оптимальный вариант - нанять разработчика бд. до этого надо написать требования и техзадание. 4) Чтоб не выполнять второй запрос можно header вставить в news, но это varchar. Я так понимаю сразу упадет производительность, т.к. это вариативное поле, да и объем таблицы сразу существенно возрастет. ты понимаешь неправильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 12:26 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
автороптимальный вариант - нанять разработчика бд. авторты понимаешь неправильно. ясно, спасибо, что в дружеской и непринужденной атмосфере помогли решить мой вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2017, 12:42 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
snksnk, не надо ничего делить, ни горизонтально, ни вертикально. 1.5 миллиона записей - это немного. просто одна таблица и все. индексы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2017, 07:05 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
Спасибо. Рад, что есть адекватные люди. Я бы тоже не хотел ничего разбивать. (сейчас полная версия таблицы занимает больше 7Гб) Если сделать правильные индексы, то все работает шустро, но есть один косяк по такой таблице - это 100500 страница в навигации LIMIT 100500, 10 такой запрос будет тормозить при любых индексах, а если сделать табличку навигации, которая будет существенно меньше, то запрос выполняется в разы быстрее (в десятки раз). Посоветуйте как быть в такой ситуации. Посоветуйте как быть с запросом по такой таблице: SELECT n.header FROM news as n WHERE n.rubric_id=4 ORDER BY n.create_at DESC LIMIT 100500, 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2017, 23:52 |
|
||
|
Производительность - проектирование базы
|
|||
|---|---|---|---|
|
#18+
snksnkСпасибо. Рад, что есть адекватные люди. Я бы тоже не хотел ничего разбивать. (сейчас полная версия таблицы занимает больше 7Гб) Если сделать правильные индексы, то все работает шустро, но есть один косяк по такой таблице - это 100500 страница в навигации LIMIT 100500, 10 такой запрос будет тормозить при любых индексах, а если сделать табличку навигации, которая будет существенно меньше, то запрос выполняется в разы быстрее (в десятки раз). Посоветуйте как быть в такой ситуации. Посоветуйте как быть с запросом по такой таблице: SELECT n.header FROM news as n WHERE n.rubric_id=4 ORDER BY n.create_at DESC LIMIT 100500, 10 тут совет простой, не писать дурацкие LIMIT ы, а написать нормальный WHERE, если условий для отбора нет, сделать их искусственно, добавить поля и обеспечить их проставление в нужные значения, или сделать отдельную табличку со списком нужных для показа записей и заполнять её. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2017, 10:14 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39409500&tid=1830892]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 368ms |

| 0 / 0 |
