@daren93
Full-stack developer

Как ускорить очень медленую view в mysql?

Есть сайт.
Предыдуший разраб был алхимиком и превратил базу в кучу мусора.
В баз есть одна вьюшка, самая важная для работы сайта.
В простое сервера вьющка отрабатывает 2 секунды на любом количестве данных (limit 1 или where id = 1).
Слив базу на локалку я получил время исполнения на limit 1 в ~40ms на всех данных вьющки в ~118ms.
Вьюшка написана мягко говоря отвратительно, но когда понимаешь какая у базы структура все становиться ясно.
5ca19add787d6692079854.png
Это список таблиц. Снизу подчеркнул вьющку, а сверху все таблицы которые она использует.
Код вьющки:
create or replace definer = kipyatcom@localhost view if not exists aws2_albums as select `kipyatcom`.`aws2_classifier_items`.`id`                        AS `id`,
       `kipyatcom`.`aws2_classifier_items`.`classifier_id`             AS `classifier_id`,
       `kipyatcom`.`aws2_classifier_items`.`title`                     AS `title`,
       `kipyatcom`.`aws2_classifier_items`.`is_visible`                AS `is_visible`,
       `kipyatcom`.`aws2_classifier_items`.`order`                     AS `order`,
       `kipyatcom`.`aws2_classifier_items`.`created_at`                AS `created_at`,
       `kipyatcom`.`aws2_classifier_items`.`updated_at`                AS `updated_at`,
       (select `kipyatcom`.`aws2_classifier_fields_values`.`value`
        from `kipyatcom`.`aws2_classifier_fields_values`
        where
            `kipyatcom`.`aws2_classifier_fields_values`.`classifier_item_id` = `kipyatcom`.`aws2_classifier_items`.`id`
          and `kipyatcom`.`aws2_classifier_fields_values`.`classifier_field_id` =
              (select `kipyatcom`.`aws2_classifier_fields`.`id`
               from `kipyatcom`.`aws2_classifier_fields`
               where `kipyatcom`.`aws2_classifier_fields`.`name` = 'city'
                 and `kipyatcom`.`aws2_classifier_fields`.`classifier_id` = 3)
          and `kipyatcom`.`aws2_classifier_items`.`classifier_id` = 3) AS `city`,
       (select str_to_date(`kipyatcom`.`aws2_classifier_fields_values`.`value`, '%d.%m.%Y %H:%i')
        from `kipyatcom`.`aws2_classifier_fields_values`
        where
            `kipyatcom`.`aws2_classifier_fields_values`.`classifier_item_id` = `kipyatcom`.`aws2_classifier_items`.`id`
          and `kipyatcom`.`aws2_classifier_fields_values`.`classifier_field_id` =
              (select `kipyatcom`.`aws2_classifier_fields`.`id`
               from `kipyatcom`.`aws2_classifier_fields`
               where `kipyatcom`.`aws2_classifier_fields`.`name` = 'date'
                 and `kipyatcom`.`aws2_classifier_fields`.`classifier_id` = 3)
          and `kipyatcom`.`aws2_classifier_items`.`classifier_id` = 3) AS `date`,
       ...
       (select `kipyatcom`.`aws2_classifier_fields_values`.`value`
        from `kipyatcom`.`aws2_classifier_fields_values`
        where
            `kipyatcom`.`aws2_classifier_fields_values`.`classifier_item_id` = `kipyatcom`.`aws2_classifier_items`.`id`
          and `kipyatcom`.`aws2_classifier_fields_values`.`classifier_field_id` =
              (select `kipyatcom`.`aws2_classifier_fields`.`id`
               from `kipyatcom`.`aws2_classifier_fields`
               where `kipyatcom`.`aws2_classifier_fields`.`name` = 'photograph'
                 and `kipyatcom`.`aws2_classifier_fields`.`classifier_id` = 3)
          and `kipyatcom`.`aws2_classifier_items`.`classifier_id` = 3) AS `photograph`,
from `kipyatcom`.`aws2_classifier_items`
where `kipyatcom`.`aws2_classifier_items`.`classifier_id` = 3;

Название сайта затирать не стал, пусть все знают, как там все через жопу.
Как это можно ускорить или что с этим можно сделать?
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Уходить от вложенных SELECT'ов, переделывать всё на JOIN. Задать нужные индексы для ускорения JOIN.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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