Заметки веб-технолога (web_tech) wrote,
Заметки веб-технолога
web_tech

OR vs UNION

Задача: достать из базы одним запросом корневые объекты и все объекты текущего треда, чтобы потом построить из них меню сайта и дублирующую навигацию.

Решение «в лоб»:
SELECT
	object_id AS id,
	...
FROM
	object
WHERE
	thread_id = 123
	OR parent_id = 0

Проблема в том, что такой запрос не сможет использовать индексы.

В документации по MySQL предлагают оптимальное решение: заменить OR на UNION.
SELECT
	object_id AS id,
	...
FROM
	object
WHERE
	thread_id = 123
UNION
	SELECT
		object_id AS id,
		...
	FROM
		object
	WHERE
		parent_id = 0

В таком случае MySQL объединит результаты двух выборок, в каждой из которых будут использоваться индексы. При этом дублирующиеся записи будут пропущены.
Tags: mysql
Subscribe

  • Еврейский SQL сервер

    Еврейский SQL сервер отвечает запросом на запрос .

  • Мёртвый скроллбар в Опере

    Обнаружил в Опере 9.24 ранее неизвестный баг. Следующий код порождает мёртвый горизонтальный скроллбар: <div style="position: absolute;…

  • Clearing floats

    Кто-нибудь может объяснить, почему даже маститые верстальщики до сих пор используют монструозный Easy Clearing, в то время как ещё год назад PPK…

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments