Задать вопрос
i_d_1
@i_d_1
Программист PHP

Mysql производительность при выброке таблиц с type text. Как лучше поступить?

Есть табличка Pages
id   |   url
1    |   /main


Есть табличка BlocksData
id   |           data                | Position_id
1    | {'JSON_OBJECT' : ''}   |       1

*data type text

Есть табличка Positions
id  | holder
1   | left


Есть связь Pages многие ко многим (табличку связи опустил) BlocksData многие к одному Position

Таблица BlocksData вертикальная разделена для ускорения индексации таблички, так как data type text.

Задача
Произвести рендеринг блоков по позициям (что то на вроде
$this->include('position_plaseholder', $Positions->render('position_plaseholder') )
что выполнит preg_replace в шаблоне с заранее подготовленным кодом лежащим в плейсхолдере). На рендеринг позиции соответственно собираются блоки и им отдается data (в JSON структуре). (Над структурой пока думаю)

Вопроса собственно два, и оба связаны с производительностью, даю варианты или выберите свой
1) Как быстрее:
1.
Select * From Pages JOIN (*многие ко многим*) JOIN BlocksData  JOIN Positions WHERE page.url = '$url'
(надеюсь понятно что тут идет упрощение чтобы не расписываться)
2.
Select * From Pages WHERE page.url = '$url';
      Select * From Pages_to_BlocksData WHERE page_id in ($page_id)
      Select * From BlocksData  WHERE id in ($imploded_blocks_id)
      Select * From Positions WHERE id in ($imploded_blocksData_id)


второй вариант лучше в лпане красоты кода. легче данные разложить в объекты, а не получать все кучкой как при JOIN. вопрос на сколько это хуже по производительности?

2) Вопрос два связан с вертикальным разделением таблицы BlocksData. опять же как быстрее (производительнее):
1. При получении позиций прихватить JSON структру по пути выборки
а)
Select * From BlocksData JOIN BlocksData_JSON  WHERE id in ($imploded_blocks_id)

или
б)
Select * From BlocksData WHERE id in ($imploded_blocks_id)
            Select * From BlocksData_JSON WHERE id in ($imploded_blocks_id)

2. При получении позиции вообще не трогать BlocksData_JSON (собственно это медленная таблица с типом данных text) а повесить получение json данных куда то в рендеринг, что породит несколько запросов к бд
Select * From BlocksData_JSON WHERE id in ($blockData_id)


PS пока писал немного запутался. Проект только на стадии планирования планирования=)) и живет только в моей голове пока, так что еще распутаюсь, но эти два вопроса меня интересовали давно.
PPS использовал упрощения для SQL запросов дабы не растягивать. не придирайтесь очень к отсутствию preper query и тп.
PPPS блоков на странице не более 30. а как правило 10-15, нагрузка на сайт средняя (предположим по 10-100 сессий за раз). бд mysql
PPPPS Знаю что JSON в бд хранить плохо, можете об этом не напоминать. думаю в сторону избавиться от него
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
xpert13
@xpert13
Full Stack Developer
На сколько я понимаю тут везде стоит выбор между использованием JOIN и нескольких SELECT. Мой совет - использовать LEFT JOIN, потому что:

A LEFT [OUTER] JOIN can be faster than an equivalent subquery because the server might be able to optimize it better—a fact that is not specific to MySQL Server alone.

(с) https://dev.mysql.com/doc/refman/5.7/en/rewriting-...

На MS SQL серверах каждый LEFT JOIN выполняется отдельным потоком! В то время как подзапросы выполняются последовательно после основной выборки. Не исключено, что MySQL/MariaDB делают так же.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы