ФорумРазработкаБазы данных → Риторический вопрос про вложенные запросы

Риторический вопрос про вложенные запросы

  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 14 сентября 2011 г. 2:54

    Столкнулся с такой интересной вещью: был запрос
    SELECT `id`, `nick`, `avatar` FROM `user` WHERE `id` IN (SELECT DISTINCT `from` FROM `message` WHERE `to` = '1' AND `type` = '0')

    В таблице `message` около 7к записей. Данный запрос извлекал десяток.
    На выполнение этого запроса ушла 21 сек !!!.

    Переписал следующим образом:
    $res = mysql_query("SELECT DISTINCT `from` FROM `message` WHERE `to` = '".$_SESSION['user']['id']."' AND `type` = '0'");
    while($rs = mysql_fetch_assoc($res)) {

    $from_a[] = $rs['from'];
    }

    $res = mysql_query("SELECT `id`, `nick`, `avatar` FROM `user` WHERE `id` IN (".implode(", ", $from_a).")");

    Это дело выполнилось за 0.02 где-то. Проще говоря моментально.

    В связи с этим встал вопрос, стоит ли использовать вложенные запросы и, самое главное, почему такая огромная разница в производительности!?!
    from TRIAL with LOVE
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 14 сентября 2011 г. 2:59, спустя 4 минуты 23 секунды

    В связи с этим встал вопрос, стоит ли использовать вложенные запросы и, самое главное, почему такая огромная разница в производительности!?!

    потому что был foreach * foreac. а стало 2 * foreach. используй индексы и все будет ок. в первой таблице я так понимаю что ID - первичный ключ, тогда во второй таблице проставь from - индекс. и повтори первый запрос. удивишься как быстро все сработает :)
    Сапожник без сапог
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 14 сентября 2011 г. 3:05, спустя 6 минут 41 секунду

    Нихрена не понял ) Можешь написать как это дело по-человечески должно выглядеть на моем примере? :)
    from TRIAL with LOVE
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 14 сентября 2011 г. 3:13, спустя 8 минут 2 секунды


    Нихрена не понял ) Можешь написать как это дело по-человечески должно выглядеть на моем примере? :)
    в твоем примере все нормально.

    только не хватает смежного индекса на второй таблице по выбираемым полям.
    Сапожник без сапог
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 14 сентября 2011 г. 3:31, спустя 17 минут 9 секунд

    TRIAL, открой для себя EXPLAIN и JOIN
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 14 сентября 2011 г. 3:40, спустя 8 минут 57 секунд

    Да давно открыть пора. А то я за все эти годы по MySQL ни одного учебника не прочитал. По этому для меня все эти JOINы и прочая фигня - темный лес.
    phpdude, кажись понял что ты имеешь ввиду. Ладно, время будет попробую еще по шаманить, а пока так оставлю )
    from TRIAL with LOVE
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 14 сентября 2011 г. 3:56, спустя 16 минут 53 секунды


    Да давно открыть пора. А то я за все эти годы по MySQL ни одного учебника не прочитал. По этому для меня все эти JOINы и прочая фигня - темный лес.
    phpdude, кажись понял что ты имеешь ввиду. Ладно, время будет попробую еще по шаманить, а пока так оставлю )
    Хули оставлять и плодить говнокод.
    Перепиши запрос на JOIN и отладь с помощью EXPLAIN, делов на 3 минуты …
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 14 сентября 2011 г. 6:02, спустя 2 часа 5 минут 14 секунд


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

    в общем, EXPLAIN обо всем раскажет …
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 14 сентября 2011 г. 6:02, спустя 23 часа 59 минут 55 секунд

    в общем, EXPLAIN обо всем раскажет …

    это факт …. тут не поспоришь)
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!