2013-09-12 3 views
3

В настоящее время я получил этот запрос:производительность MySQL дизъюнктивно в сочетании с тем, где статья

SELECT 
    location.street, 
    location.zip, 
    location.city, 
    surface, 
    price_buy, 
    price_rental 
FROM buildings 
JOIN location 
    ON building.location_id = location.location_id 
WHERE surface > 1000 

Желаемое поведение (с точки зрения производительности) будет:

  1. фильтр все результаты из buildings с surface > 1000
  2. Извлечь данные location, соответствующие оставленным buildings материалам.

Является ли мой запрос в настоящее время этим? Синтаксически я ожидал бы, что WHERE должен быть до JOIN, но возможно ли это? Действительно ли MySQL выполняет какую-либо оптимизацию, если да, то такая же оптимизация выполняется для всех языков SQL?

+0

Можете ли вы показать структуру таблицы? – Phil

+0

Похоже, что ваш запрос находится на месте. – Lobo

+1

имя таблицы - здание или здания? Используемые здания в одном месте и здания в одном месте – rakeshjain

ответ

6

Во-первых, ваш запрос делает противоположное тому, что вы хотите - это отфильтровывая (т.е. удаление) зданий, поверхности которых < = 1000.

Синтаксически Я бы ожидать, что ГДЕ бы должны быть до ПРИСОЕДИНЯЙТЕСЬ, но возможно ли это?

Нет, ваш синтаксис в порядке. Причина, по которой первые объединяются, состоит в том, что они идентифицируют таблицы для запроса и там отношения; только после того, как вы это сделали, вы указываете, какие строки вы делаете и чего не хотите.

Формализованность синтаксиса SQL позволяет оптимизатор запросов, чтобы понять, что вы имели в виду (до тех пор, как вы

делает сам MySQL делает любая оптимизация, если да, то что же держать оптимизация для всех языков SQL? .

Да, MySQL (и почти все базы данных SQL система) включает в себя оптимизатор запросов, который переводит ваш SQL в конкретные инструкции Номинальна, SQL является declarative языка - вы говорите компьютеру, что вы хотите достичь, и предполагается, что он разработает наиболее эффективный способ сделать это - это противоречит императивному программированию (PHP, C, Ruby и т. Д.), Где вы явно указываете компьютеру, что делать и в каком порядке.

Вы можете получить пик в том, как это работает с EXPLAIN.

С точки зрения производительности, порядок объединений и где предложения не должны иметь значение (хотя я видел некоторые базы данных, где это не всегда верно); однако стратегия индексирования таблиц имеет огромное влияние. Плохая новость заключается в том, что это имеет тенденцию варьироваться в зависимости от механизма базы данных.

0

Если вы хотите оставить здания, сделайте предложение WHERE противоположным: surface <= 1000. Это приведет к возврату нестандартных записей.

Смежные вопросы