powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Производительность - проектирование базы
14 сообщений из 14, страница 1 из 1
Производительность - проектирование базы
    #39398536
snksnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, не хочу ошибиться на начальном этапе, помогите плиз

Есть новостной сайт
Объем таблицы новостей - 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. Я так понимаю сразу упадет производительность, т.к. это вариативное поле, да и объем таблицы сразу существенно возрастет.
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398541
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snksnk,
надо не бояться количества таблиц, хоть сотня,
есть такое понятие - сравочник,
все темы в него, есть такое понятие таблица связь,
связывает темы и сами новости.
(это как пример)
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398548
snksnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за ответ
меня не пугает количество таблиц, меня больше интересуют те вопросы о которых я спросил, особенно 2 и 4
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398554
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snksnkспасибо за ответ
меня не пугает количество таблиц, меня больше интересуют те вопросы о которых я спросил, особенно 2 и 4
запросы будут следовать из структуры базы, структура из назначения таблиц.
поэтому эти вопросы ещё рано задавать
как только сформируется стуктура - ответы будут найдутся сами.
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398559
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всего-то 1,5 млн записей. Как-то не вижу смысла в разделении таблиц.
1,5ляма например по 2кб текста (а это уже прилично текста) - всего-то 3 гб данных. При том text'ы хранятся отдельно, так что сама табличка совсем маленькая. И дикого роста не предвидится.
Внятно проставить индексы и всё. Поскольку ожидается большая часть нагрузки на запросы по последним дням - партицировать по месяцам можно. Не забудьте только в запросы проставить условия, явно отсекающие ненужные партиции.

Насколько понимаю специфику новостных сайтов - там чуть менее чем вся нагрузка - это чтение от преимущественно анонимных пользователей.
nginx + memcache/redis для кеширования страницы целиком вовсе минуя бекенд? Кеширование почти целиком + SSI для редких динамических блоков?
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398561
snksnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как-то уходим в глубокую теорию.

Я постарался расписать задачу, которая стоит, а также исходные данные и вариант своего решения (своей структуры основной таблицы).
Меня интересует нормально ли такое решение
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398563
snksnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij, о, спасибо уже по делу.

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

Т.е. тексты материалов, заголовки и служебную информацию (дата новости, id рубрики и т.д.) хранить в одной таблице? Сейчас они как раз и хранятся в одной таблице. я и хочу их вынести отдельно. Вот только нужно ли выносить заголовки или varchar можно оставить
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398568
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snksnk,

вот я и не вижу смысла, зачем делить таблицу на две? Их потом джойнить надо, кросстабличных индексов нет, так что ещё и индексировать сложнее становится. Проблем добавится много, а что взамен - неясно.
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398569
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snksnkДобрый ыдень, не хочу ошибиться на начальном этапе, помогите плиз

Есть новостной сайт
Объем таблицы новостей - 1,5 млн записей.
Сайт довольно нагруженный

переделываем структуру базы

Я хочу разбить таблицу с новостями на две

news - хранится только НЕ вариативная информация (дата новости, количество просмотров, author_id, rubric_id и т.д.)
news_articles - хранится заголовок, тело новости и т.д., а также news_id (связь с таблицей news)

Таблицу news шардирую по createdAt (т.к. в каждом запросе будет order по дате)
Таблицу news_article шардирую по Id

.


чего ты делаешь с таблицей news?

лучше обратись к профессионалам, не смеши людей.
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398570
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Насколько так правильно делать? Хочется добиться максимальной производительности


когда проектируют бд, не думают о
производительности, думают о правильной структуре только.


2) По такому принципу хочу формировать все блоки на главной, смущает, что news_id IN (...) может быть много параметров - до 50 или даже 100, т.е. news_id IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?...) Это не проблема?

это не проблема проектировани бд, это проблема написания запросов.

3) Может посоветуете более оптимальные варианты

оптимальный вариант - нанять разработчика бд.

до этого надо написать требования и техзадание.

4) Чтоб не выполнять второй запрос можно header вставить в news, но это varchar. Я так понимаю сразу упадет производительность, т.к. это вариативное поле, да и объем таблицы сразу существенно возрастет.


ты понимаешь неправильно.
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398571
snksnk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автороптимальный вариант - нанять разработчика бд.

авторты понимаешь неправильно.

ясно, спасибо, что в дружеской и непринужденной атмосфере помогли решить мой вопрос.
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39398755
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
snksnk,

не надо ничего делить, ни горизонтально, ни вертикально. 1.5 миллиона записей - это немного.
просто одна таблица и все. индексы
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39408817
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
...
Рейтинг: 0 / 0
Производительность - проектирование базы
    #39409500
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, если условий для отбора нет, сделать их искусственно, добавить поля и обеспечить их проставление в нужные значения, или сделать отдельную табличку со списком нужных для показа записей и заполнять её.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Производительность - проектирование базы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]