2016-02-04 3 views
1

Как все мы знаем, что где предложение SQL-запроса выполняется до , выберите пункт. И мы помещаем некоторые условия в where clause, чтобы отфильтровать результат в соответствии с нашим требованием.Недостаток использования нескольких условий в том, где статья

При написании некоторых запросов я столкнулся с вопросом, что есть/есть ли какие-либо недостатки использования нескольких условий в предложении where и в каком порядке они применяются для фильтрации результата из выбранной таблицы.

Например: у нас есть таблица

Building(name,height,owner,builder_name,age) 

и у нас есть запрос:

select * from Building 
    where height between X and Y and age between A and B 

Теперь, как этот запрос будет выполняться. А что порядок условий, т.е.

X < = высота < = Y и A < = возраст < = B

Будет ли это что-то вроде, первый вся запись будет искать высоты в пределах данного диапазона, и тогда то же самое будет сделано для возраста хорошо. ???

ответ

1

Сервер базы данных имеет несколько вариантов решения этого запроса. Он выберет вариант, который сервер «думает» быстрее.

варианты я вижу, является:

  • Сканирования всей таблицы и отфильтровать строки, которые не удовлетворяют where пункта
  • Добиваться height диапазоном по индексу на height колонке, а затем отфильтровать строки используя age between A and B предикат.
  • искать age диапазон по индексу на age колонке, а затем отфильтровать строки с помощью height between X and Y предикат
  • Искать как индексы, а затем выполнить индекс пересечения

Сервер базы данных не всегда используют индекс, который может быть применимо, он рассматривает некоторые вещи перед его использованием, такие как:

  • Показатель селективности.
  • Показатель охвата.

С высокой вероятностью будут использоваться индексы высокой селективности. Покрывающие индексы, вероятно, используются.

+0

@ Lopez, так что U говорят, что вместо того, чтобы иметь комбинированный индекс, то есть (высота, возраст), у каждого должен быть отдельный индекс для высоты и возраста столбцов ... Теперь именно этот индекс пересечения будет работать в этом сценарии ?? ... И PLZ дать мне дополнительную информацию об избирательности и охвате, bcz это новые вещи для меня, как свежее. –

1

Планировщик запросов попытается найти оптимальный способ поиска в таблице и проверить предложение WHERE. Он начнется с попытки использовать индекс, если это возможно, что сузит строки, которые нужно искать. Если есть несколько потенциальных индексов, он попытается использовать тот, который, по его оценкам, сужает его лучше всего.

Затем он сканирует все эти строки и проверяет каждое из них на все остальные условия. Ему не нужно делать несколько проходов по всей таблице.

Если вы хотите увидеть, как будет выполняться конкретный запрос, используйте команду EXPLAIN.

+0

Сэр .. когда мы говорим о поиске, индексирование играет важную роль в этом. Теперь мой вопрос в том, что, если я добавлю комбинированный индекс (высота, возраст); поможет ли это в поиске? PLZ предлагает некоторые другие методы, которые могут улучшить результат поиска аналогичного рода запросов, как я упоминал в вопросе. FYI, я рассматриваю таблицу с миллиардами записей. –

+0

Это может быть! Проблема в том, что у вас есть 2 диапазона, чем перекрытие. Индекс по высоте может быть лучше индекса по возрасту для конкретного выполнения этого запроса, но, возможно, не следующего. Но с индексом покрытия в первом элементе будут диапазоны (возможно, многие), которые не соответствуют второму, поэтому вторая часть индекса имеет ограниченное использование. MySQL не может просто захватить непрерывный диапазон записей из индекса. – Kickstart

+0

@Kickstart. По моим сведениям, индексирование помогает нам искать в O (logn). правильно? .. Вы имеете в виду, что индексирование полезно только тогда, когда мы ищем конкретное значение не для диапазона значений? Итак, что еще вы предлагаете улучшить результат поиска ??? Plz не возражаете, если некоторые из вопросов кажутся глупыми, bcz как стажер много вещей для меня новичок, и у меня возникло множество вопросов. :) –

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