Запрос проверяет слишком много строк, как я могу уменьшить?

#php #mysql #query-optimization

#php #mysql #оптимизация запроса

Вопрос:

Следующий запрос неэффективен, и мне нужно заставить его выполняться намного быстрее.

 id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY sob_datas   ALL sob_form_id,sob_form_id_2   NULL    NULL    NULL    365990  Using where
2   DEPENDENT SUBQUERY  sub_sob_datas   ALL sob_form_id,sob_form_id_2   NULL    NULL    NULL    365990  Using where
  

Как я могу оптимизировать этот запрос? sob_field_value это text поле

Я извлекаю поля в каждой из этих форм, которые имеют разные значения.

 SELECT
                sob_datas.id,
                sob_datas.sob_field_name,
                sob_datas.sob_field_value
            FROM sob_datas
            WHERE sob_form_id = '.$proof['SobForm']['id'].' AND
            EXISTS(
                    SELECT
                        sub_sob_datas.id
                    FROM sob_datas AS sub_sob_datas
                    WHERE sub_sob_datas.sob_form_id = '.$original['SobForm']['id'].' AND
                    sub_sob_datas.sob_field_name = sob_datas.sob_field_name AND
                    sub_sob_datas.sob_field_value != sob_datas.sob_field_value
            )
  

Я также должен отметить, что я собираюсь обновить только измененные поля новыми значениями

Ответ №1:

Трудно понять, что здесь пытаются сделать 🙂 Итак, надеюсь, я уловил суть, и это то, что вы ищете / работает. Если нет, дайте мне знать, и я попытаюсь разобраться.

Немного тестовых данных может помочь процессу (5-10 строк или около того) и то, что, как ожидается, будет извлечено из этих строк. Но вот мой шанс на это:

     SELECT
            sob_datas.id,
            sob_datas.sob_field_name,
            sob_datas.sob_field_value
    FROM sob_datas sd 
        JOIN sob_datas ssd ON sd.sob_field_name = ssd.sob_field_name
    WHERE sd.sob_form_id = '.$proof['SobForm']['id'].' 
        AND sd.sob_field_value != ssd.sob_datas.sob_field_value