За последние 24 часа нас посетили 20188 программистов и 1693 робота. Сейчас ищут 1893 программиста ...

OR vs IN() vs UNION

Тема в разделе "MySQL", создана пользователем armadillo, 20 ноя 2007.

  1. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    кто-то сталкивался и на каких версиях что быстрее? на простых запросах похоже оптимизатор приводит их к одному типу.
     
  2. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    armadillo
    Как-то очень смахивает на вопрос "что лучше, пила или молоток"... хотя бы приведи примеры использования :)
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Давал ссылку буквально на днях (на более старое моё сообщение) где примеры совершенно "странных" результатов

    Только там OR не было, но IN был и JOIN ещё
    http://php.ru/forum/viewtopic.php?p=60598#60598

    (а по теме конкретнее опиши ситуацию, может у тебя там какой другой случай типа RAND или ещё чего мешает...)
     
  4. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а у меня в зависимости от бд и типа запроса были быстрее то or, то in. иногда разница достигала разов.
    я ещё плакался тут на эту тему недавно...
     
  5. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Мне здесь больше всего интересно, как работает запрос SELECT * FROM table WHERE id IN (...), где id - индексированное поле. Одно из двух, либо 1) мускул поочередно отслеживает каждое значение id из списка, опускаясь по дереву индекса; либо 2) мускул пробегает по всей таблице, для каждой записи проверяя, соответствует ли она списку. Первый способ явно предпочтительнее (по крайней мере на больших таблицах), но у меня почему-то в зависимости от версии (сейчас я на 4.1) и объема таблицы получались совсем разные результаты :( возникало такое ощущение, что он действительно последовательно пробегает все записи, просто в качестве оптимизации ограничивает область поиска минимальным и максимальным значением id. Но это все равно не есть гуд...
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Сравниваем.
    [sql]SELECT SQL_NO_CACHE * from task, clients where ts_cl_id=cl_id AND cl_status=1 and ts_result_id>0[/sql]
    и
    [sql]SELECT SQL_NO_CACHE * from task , (SELECT cl_id from clients where cl_status=1) t1 where ts_cl_id =cl_id
    and ts_result_id>0[/sql]
    у кого что быстрее?