2012-05-22 2 views
2

В mysql, когда у вас есть 3 таблицы (огромный объем данных), объединены предложением JOIN, в конце SELECT у вас есть предложение LIMIT, SQL-движок делает декартовы произведение таблиц и после этого применяется LIMIT или существует какая-либо оптимизация, сделанная ранее?Поведение LIMIT с использованием предложения JOIN

Я спрашиваю, потому что операция JOIN - дорогостоящая операция, если мы используем большие объемы данных.

В этом случае лучше выполнить JOIN и вытащить все данные, или сделать предложение SELECT с LIMIT N раз?

+0

Mysql не получает больше данных, чем требуется для создания набора результатов. Так что, если это возможно - он читает только количество строк LIMIT – zerkms

+0

С другой стороны, некоторые вещи * могут * предотвратить прерывание MySQL досрочно - например. ORDER BY * может * заставить весь RS быть материализованным первым, потому что LIMIT - это «операция просмотра». –

+0

@pst: это не так очевидно - потому что 'ORDER BY' может использовать индексы – zerkms

ответ

0

Нет, функция ограничения является только визуальным эффектом впоследствии.

1/ПРИЛОЖЕНИЯ рассчитываются.

2/ГДЕ фильтры, а также фильтры HAVING обрабатываются

3/ЛИМИТ уменьшает количество возвращаемых результатов. Порядок все еще сохраняется, если вы указали какое-либо предложение ORDER BY.

Улучшите свои соединения, чтобы улучшить накладные расходы.

+0

Почему вы так думаете? – zerkms

+0

, потому что для уменьшения накладных расходов вам необходимо уменьшить количество строк сканирования. Функция ограничения не предотвращает сканирование, поскольку парсер все еще должен рассчитать все, чтобы знать, что ему нужно «ограничить». Используйте предложение WHERE, чтобы уменьшить накладные расходы. – Sebas

+1

«все еще нужно рассчитать все, чтобы знать, что ему нужно« ограничить », - это просто неправильно. mysql может возвращать строки до тех пор, пока они не получат строки «LIMIT N» – zerkms

1

Короткая версия: это зависит от запроса

Более длинная версия: когда у вас есть условие LIMIT, то предполагается, что вы данные упорядоченный каким-то образом. Если вы явно не укажете предложение ORDER BY, вы увидите, что выполнение запроса остановится, пока MySQL найдет необходимое количество строк. Если у вас есть заказ, для которого требуется fileort, все данные будут отсортированы во временной таблице, а MySQL выведет первые N строк, которые вы указали.

Но если вы принудительно применили конкретный порядок соединения и использования индекса, MySQL будет очень коротко цирковать выполнение.

+0

Хорошо, это имеет смысл, потому что индекс обычно имеет какой-то порядок, автоинкремент, даты и т. д. Поэтому, если я использую предложение WHERE и не заставляю движок mysql выполнять сортировку, внутренняя оптимизация может быть выполнена –

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