Приветствую, товарищи! Не сочтите за глупость, но у меня образовалась пара тривиальных вопросов на которые я никак не могу найти четкого ответа. Надеюсь вы поможете мне.
1. ON vs WHERE
Вопрос: Что предпочтительнее и быстрее работает, множественные связи в JOIN или условия в WHERE?
Пример:-- Вариант первый
SELECT
`table_one`.`field_id`,
`table_two`.`field_data`
FROM
`table_one` INNER JOIN `table_two`
ON
`table_one`.`field_one` = `table_two`.`field_one` AND
`table_one`.`field_two` BETWEEN 23 AND 32 AND
`table_two`.`field_two` LIKE '%foobar%'
-- Вариант второй
SELECT
`table_one`.`field_id`,
`table_two`.`field_data`
FROM
`table_one` INNER JOIN `table_two`
ON
`table_one`.`field_one` = `table_two`.`field_one`
WHERE
`table_one`.`field_two` BETWEEN 23 AND 32 AND
`table_two`.`field_two` LIKE '%foobar%'
Мои догадки: Немного понасиловав
мозг движок google, наткнулся на рассуждения о том, что связи в секции ON применяются в процессе формирования dataset'a, а условия из WHERE фильтруют уже сформированый dataset. Получается, что разницы никакой нет? Или я ошибся с оценкой сложности? К тому же, говорят, что оптимизатор иногда сам перемещает условия между секциями на свое усмотрение.
2. Порядок
Вопрос: Влияет ли порядок конкатенации условий на производительность?
Пример:-- Вариант первый
SELECT *
FROM `table`
WHERE
`field_string` LIKE '%foobar%' AND
`field_integer` BETWEEN 23 AND 32
-- Вариант второй
SELECT *
FROM `table`
WHERE
`field_integer` BETWEEN 23 AND 32 AND
`field_string` LIKE '%foobar%'
Мои догадки: Условия LIKE довольно затратно. Во всяком случае, затратнее (более затратно?), чем сравнение чисел. Поэтому, логично было бы предположить, что его стоит делать после того, как из dataset'a будут исключены поля, не подходящие под условие с числами. Так ли это? И если это так, делает ли работу по упорядочиванию условий оптимизатор?
3. WHERE 1
Вопрос: Влияет ли на производительность пустое условие WHERE 1 или WHERE 1=1?
Пример:-- Вариант первый
SELECT *
FROM `table`
WHERE
condition1 AND
condition2 AND
...
conditionN
-- Вариант второй
SELECT *
FROM `table`
WHERE 1
AND condition1
AND condition2
...
AND conditionN
Мои догадки: Логично, что раз это условие, то она будет работать так же, как и остальные: применяться к каждому полю из dataset`а. Если это так, то выходит, что на больших наборах данных мы будем иметь огромное количество пустых проверок? Или, это как по другому работает? А может оптимизатор просто уберет это условие?
Я особо помешан на форматировании, можно сказать, у меня на этом пунктик, поэтому, мне важно оформлять код максимально
псевдоэстетично. Недавно открыл для себя эту «фишку» — начинать каждое условие с AND/OR. Мне кажется, довольно красиво выходит. Но если это будет во вред производительности, то мне придется отказаться от этого.