Заметки веб-технолога (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

  • Множественный UPDATE

    Если нужно обновить сразу несколько записей, необязательно делать UPDATE для каждой из них. В простейших случаях можно использовать следующий…

  • MSSQL vs MySQL

    Google рекомендует:

  • Формат TIMESTAMP

    В MySQL есть два похожих типа столбцов: DATETIME и TIMESTAMP. Одно из отличий состоит в том, что DATETIME имеет вид YYYY-MM-DD HH:MM:SS, а TIMESTAMP…

  • 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