Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день,
Столкнулся с проблемой, что mysql меняет порядок условий в WHERE.
Есть база:
Неактивен
sergej-123 написал:
MySQL отдает, и собственно пытается выполнить, вот такой запрос:
Это где вы смотрите?
sergej-123 написал:
Как видим MySQL поменял очередность условий в WHERE (1 и 2 условие), что не очень хорошо сказывается на больших объемах данных.
Пробовал в запросе в WHERE брать условия в скобки () чтобы указать очередность, но толку нет, всё равно MySQL именно так преобразовывает. Что делать?
"h.id_con = c.id" - это не условие в части where, а способ связывания таблиц, т.е. относится к части join, поэтому и выполняется всегда до where.
Поместите "c.cid = 2" в условие связывания таблиц или честно напишите подзапрос.
Неактивен
Как видим MySQL поменял очередность условий в WHERE (1 и 2 условие), что не очень хорошо сказывается на больших объемах данных.
С чего вы это взяли ?
Если есть аргументы, то сылку на источники пожалуйста.
Отредактированно evgeny (29.08.2011 15:42:41)
Неактивен
vasya написал:
sergej-123 написал:
MySQL отдает, и собственно пытается выполнить, вот такой запрос:
Это где вы смотрите?
Uploaded with ImageShack.us
vasya написал:
sergej-123 написал:
Как видим MySQL поменял очередность условий в WHERE (1 и 2 условие), что не очень хорошо сказывается на больших объемах данных.
Пробовал в запросе в WHERE брать условия в скобки () чтобы указать очередность, но толку нет, всё равно MySQL именно так преобразовывает. Что делать?"h.id_con = c.id" - это не условие в части where, а способ связывания таблиц, т.е. относится к части join, поэтому и выполняется всегда до where.
Поместите "c.cid = 2" в условие связывания таблиц или честно напишите подзапрос.
не понял как "c.cid = 2" добавить
Неактивен
FROM con c join hist h on (c.cid = 2 AND h.id_con = c.id)
Неактивен
Неактивен
очередность условий в WHERE (1 и 2 условие), что не очень хорошо сказывается на больших объемах данных.
vasya Можешь это прокомментировать ? Направить на материал ? Никогда не слышал что порядок условий может играть какую то роль.
Неактивен
evgeny написал:
очередность условий в WHERE (1 и 2 условие), что не очень хорошо сказывается на больших объемах данных.
vasya Можешь это прокомментировать ? Направить на материал ? Никогда не слышал что порядок условий может играть какую то роль.
порядок не будет играть роли на таблицах по 100 записей, а вот объединение таблиц с сотнями миллионов записей порядок будет играть ох какую большую роль
Неактивен
Дайте какой то аргумент, либо сылку на материал. Так же был бы рад услышать мнение модераторов
Неактивен
evgeny написал:
очередность условий в WHERE (1 и 2 условие), что не очень хорошо сказывается на больших объемах данных.
vasya Можешь это прокомментировать ? Направить на материал ? Никогда не слышал что порядок условий может играть какую то роль.
Тоже никогда о таком не слышал
Upd: Пардон, что-то я чушь написал прошлый раз. Вы совершенно правы.
Неактивен
Эммммм.... немного не понял, всё-таки есть проблема или же я чего-то не понимаю?
Неактивен
Я подозреваю, что имеется в виду не столько порядок условий в WHERE, сколько
порядок следования таблиц в объединении.
Но проблемы я в этом не вижу, т.к. по словам автора изначального сообщения
«т.е. всё по индексам проходит, всё ОК» Запрос выполняется так, как написано
в EXPLAIN, и ничто не может ему помешать.
Неактивен
paulus написал:
Я подозреваю, что имеется в виду не столько порядок условий в WHERE, сколько
порядок следования таблиц в объединении.
Но проблемы я в этом не вижу, т.к. по словам автора изначального сообщения
«т.е. всё по индексам проходит, всё ОК» Запрос выполняется так, как написано
в EXPLAIN, и ничто не может ему помешать.
Ладно, перефразирую вопрос, в поле rows в explain отдается значение около 10млн. при объединении двух таблиц (h.id_con = c.id), т.е. MySQL надо проанализировать 10млн строк для выполнения запроса, а только после этого выбираются записи, которые удовлетворяют условию "c.cid = 2".
Если я правильно понимаю, то если бы первым обработалось условие "c.cid = 2", выбрав при этом 20 строк, то объединять 2 таблицы было бы сделано с меньшими затратами. Я прав?
Неактивен
Ипсользуйте
Неактивен
Но если Вы перечислите таблицы плохо, то будет только хуже (и MySQL очень редко
ошибается, когда выбирает порядок следования таблиц). Если MySQL выбирает другой
(по сравнению с тем, который Вы предполагаете) порядок объединения таблиц — это,
скорее всего, признак того, что не хватает какого-то индекса (в Вашем примере — над
теми 20 строками. И выбирать такую таблицу первой оказывается менее выгодным).
Неактивен