Проверка запросов на слишком много строк, как я могу уменьшить? - PullRequest
0 голосов
/ 19 апреля 2011

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

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 Ответ

2 голосов
/ 19 апреля 2011

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

Немного тестовых данных может помочь процессу (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
...