Нужно ли создать отдельную таблицу, содержащую только поле x из таблицы с огромными полями, для улучшения производительности запросов?

Как можно улучшить структуру базы данных, чтобы избежать проблем с производительностью из-за большого объема текстовых данных в поле chapter_text при выполнении запроса на вывод списка глав книги по book_id?
  • 19 августа 2024 г. 20:24
Ответы на вопрос 2
1. Для улучшения производительности запросов, можно создать отдельную таблицу, содержащую только поле x из таблицы с огромными полями. Это позволит уменьшить объем данных, которые необходимо обрабатывать при выполнении запросов, что в свою очередь повлияет на скорость выполнения запросов.

2. Для улучшения структуры базы данных и избежания проблем с производительностью из-за большого объема текстовых данных в поле chapter_text, можно использовать следующие подходы:
- Использовать индексы для полей, по которым выполняются запросы, например, создать индекс на поле book_id, чтобы ускорить выполнение запросов на вывод списка глав книги по определенному book_id.
- Разбить текстовые данные на более мелкие части (например, на абзацы) и хранить их в отдельной таблице, связанной с основной таблицей по book_id. Таким образом, при выполнении запросов на список глав книги, можно будет извлечь только необходимые данные.
- Использовать кэширование или кеширующие слои для уменьшения нагрузки на базу данных. Например, можно кэшировать результаты запросов на вывод списка глав книги и обновлять их при необходимости.
- Оптимизировать запросы и структуру таблицы, избегая использования лишних JOIN операций или избыточных запросов.
- Разделить данные на разные таблицы по категориям или атрибутам, чтобы уменьшить объем данных, которые необходимо обрабатывать при выполнении запросов.
Надеюсь индекс (id,book_id, title) у Вас построен ? 
Если да и оперативки достаточно, чтобы он целиком оставался в ОЗУ, то
запрос select id,book_id,title выполняется без обращения к диску. Если памяти маловато, то перечитавает с диска только файл индекса.

А вот для индекса только по book_id будет читать и основной файл.

А так ваше предположение сделать кей - валуе хранилище для блобов вполне правильное.
Будет прекрасно работать по первичному ключу.

Но думаю пока дробить нет смысла. Просто пишите код так, чтобы потом можно было легко переделать.
Н-р заведите две константы с одинаковым пока значением
TABLE_CHAPTERS_INFO и TABLE_CHAPTERS_TEXT

А разнесете их физически, после того как захотите добавить еще какие-то поля помимо титла. Н-р размер в байтах и / или листах, дату обновления
Похожие вопросы