|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Есть у меня одна задача. Ускорить одну хорошую CMS. Ну не всю конечно, а те места где я выбираю данные для вывода на страницы сайта. Проблема в том, что структура базы данных CMS такова, что все значения всех полей объектов хранятся в отдельной таблице и связаны с таблицей объектов с помощью внешнего ключа. В итоге чтобы скажем провести фильтрацию данных по 3-м полям там городится запрос с джойнами двух таблиц самих на себя. Если данных не много это отрабатывает относительно быстро, но если их много, это всё тормозит. Страница сайта формируется 2 секунды. Казалось бы не много, но по современным меркам если формирование более 0,5 секунды - это уже долго. Поскольку структуру БД этой CMS я менять не могу, точнее не могу менять таблицы, которые идут с самой CMS, то у меня возникла идея добавить в базу свои таблицы, в которых развернуть эти объекты в плоский вид. Тоесть чтобы в одной строке таблицы были все нужные поля и отобрав из этой таблицы нужные объекты в основной таблице отбирать объекты уже не по полям, а по ID. В этом случае количество джойнов сократится существенно и всё будет работать быстро. Для того, чтобы данные в моих дополнительных табличках всегда были актуальные я решил повесить на основные таблицы триггеры и в них обновлять вспомогательные таблицы. Как считаете, стоит так делать? Я слышал, что триггеры не рекомендуют лишний раз использовать. Это может привести к проблемам. Может у кого опыт были? Есть ли смысл заморачиваться с триггерами или может лучше сразу всё это перенести на уровень php? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 02:32 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Prizzrak структура базы данных CMS такова, что все значения всех полей объектов хранятся в отдельной таблице и связаны с таблицей объектов с помощью внешнего ключа. Prizzrak чтобы скажем провести фильтрацию данных по 3-м полям там городится запрос с джойнами двух таблиц самих на себя. Prizzrak у меня возникла идея добавить в базу свои таблицы, в которых развернуть эти объекты в плоский вид. Prizzrak Есть ли смысл заморачиваться с триггерами Prizzrak или может лучше сразу всё это перенести на уровень php? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.12.2020, 07:29 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Вот запрос который генерируется CMS на одном из блоков страницы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Как видите тут 3 лефтджойна. Их может быть больше. Они подключают много раз одну и ту же таблицу. В таблице этой может быть много данных и запрос из-за этого тормозит. Вот структура таблицы cms3_hierarchy: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
cms3_objects Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
cms3_object_content Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Как тут можно переписать запрос, чтобы он не тормозил? У меня идея создать таблицу с контентом в которой все поля конкретного внутреннего типа в одной записи и упростить запрос до. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Подозреваю, что это будет выполняться значительно быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 00:47 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Prizzrak Вот запрос который генерируется CMS на одном из блоков страницы Prizzrak Как тут можно переписать запрос, чтобы он не тормозил? Заменяем Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
на Код: sql 1. 2. 3. 4. 5. 6. 7.
А ещё - смотрим на тип данных поля cms3_object_content.field_id , и если оно оказывается числовым, то заменяем список на числовой: (509, 516, 517) . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 07:46 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Akina, Дело в том, что в других подобных запросах может быть другое поле вместо int_val и значение там может быть другое. Потому да, конкретно этот запрос можно так ускорить, как Вы предложили. Но мне нужно универсальное решение. Потому я и хочу попробовать сделать вспомогательные таблицы и заполнять их с помощью триггеров. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 11:22 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Prizzrak, А как часто изменяется информация в исходных таблицах? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 15:16 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
miksoft Prizzrak, А как часто изменяется информация в исходных таблицах? На этих трёх таблицах построена вся система. Данные в таблице cms3_hierarchy меняются когда создаётся или удаляется страница на сайте. Это происходит не очень часто. Если товары на сайт загружаются из внешнего источника и товарный состав часто меняется, то данные в этой табличке меняются при каждой синхронизации. Обычно это раз в сутки. В табличке cms3_objects хранятся почти все сущности CMS. Это например заказы, адреса доставки и т.д. В этой табличке много данных и они меняются достаточно часто, при создании любой сущности на сайте. Но самая нагруженная это табличкаcms3_object_content. В ней данные меняются при любом изменении данных на сайте. Скажем у товара поменялось описание данные в первых двух табличках не меняются, а в этой поменяются. Я собираюсь не все изменения выгружать во вспомогательные таблицы. На сайте есть такие сущности, как типы данных. Они все свои данные хранят в этих вот таблицах, но используются они с разной частотой. Планирую вспомогательные таблицы использовать только для тех типов, которые участвуют в выборах и реально тормозят. Таких не много и они будут строиться на данных, которые меняются редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 16:06 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Prizzrak Таких не много и они будут строиться на данных, которые меняются редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 18:01 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
miksoft Prizzrak Таких не много и они будут строиться на данных, которые меняются редко. Это мой план Б. У него есть один минус. Если данные поменялись в середине дня, то до ночи данные на сайте будут отображается некорректно. Триггеры позволят избежать этой проблемы. Мне пока так и не ответили, почему лучше их не использовать для данной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 18:11 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Prizzrak Мне пока так и не ответили, почему лучше их не использовать для данной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 18:28 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
miksoft Prizzrak Мне пока так и не ответили, почему лучше их не использовать для данной задачи. Время модификации таблицы - это понятно. Надо просто померить. Триггеры планирую сделать простые и не ресурсоёмкие. Вот с каскадными ключами у меня вопрос. Вот каскадный констрейнт: Код: sql 1.
Я верно понял, что он означает что если в таблице cms3_objects поменяется значение в поле id, то в текущей таблице оно тоже поменяется в поле obj_id, а если строка из таблицы cms3_objects удалится, то из текущей таблицы тоже должны удалиться все строки в которых obj_id=id? И второй вопрос: В случае описанных выше изменений не сработают триггеры на текущей таблице, но на таблице cms3_objects её триггеры сработают? Если всё так, то это не проблема. Это конечно надо учесть, но это не проблема. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 18:58 |
|
Поговорим о триггерах
|
|||
---|---|---|---|
#18+
Prizzrak Я верно понял, что он означает что если в таблице cms3_objects поменяется значение в поле id, то в текущей таблице оно тоже поменяется в поле obj_id, а если строка из таблицы cms3_objects удалится, то из текущей таблицы тоже должны удалиться все строки в которых obj_id=id? И второй вопрос: В случае описанных выше изменений не сработают триггеры на текущей таблице, но на таблице cms3_objects её триггеры сработают? В доке написано довольно скупо, без подробостей: https://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html#stored-routines-trigger-restrictions Triggers are not activated by foreign key actions. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.12.2020, 21:29 |
|
|
start [/forum/topic.php?fid=47&msg=40030855&tid=1828263]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 245ms |
total: | 392ms |
0 / 0 |