Как обтработает этот запрос?
Произойдет выборка 1000 записей и возврат 1 , либо же первые 999 будут пропущены? Подозреваю что верно первое предположение, но все же, как?
----- Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
Uchenik
Отправлено: 23 Февраля, 2012 - 15:02:31
Частый гость
Покинул форум
Сообщений всего: 187
Дата рег-ции: Авг. 2011
Помог: 1 раз(а)
Первый параметр с какой записи, а второй сколько
snikers987
Отправлено: 23 Февраля, 2012 - 15:05:43
Участник
Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011 Откуда: Крым
Помог: 25 раз(а)
Uchenik пишет:
Первый параметр с какой записи, а второй сколько
Да не ужили? Разве в этом вопрос?
----- Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
OrmaJever
Отправлено: 23 Февраля, 2012 - 15:21:02
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Скорее всего первые 999 бд пропустит. Это можно проверить замеряв время запроса
[SQL]
SELECT * FROM `test` WHERE id=20000001;
Affected rows: 0
Time: 0.001ms
Champion
Отправлено: 23 Февраля, 2012 - 17:55:56
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
EuGen пишет:
MySQL >=4.1 - СУБД сразу выберет нужное исходя из параметров LIMIT
Ээм. Это физически не может быть реализовано, потому что результирующий набор может получаться каким угодно способом и сортироваться не менее каким угодно способом. Чтоб выполнить такой Limit, надо в любом случае пробежаться по всем строкам
EuGen
Отправлено: 23 Февраля, 2012 - 18:30:25
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Champion
Во-первых, речь не о "каком угодно наборе", а о
snikers987 пишет:
SELECT * FROM `table` LIMIT 999, 1
- и вот это СУБД способна оптимизировать.
Во-вторых, в случае WHERE следует помнить, что LIMIT - это частный случай HAVING и он будет перебирать все результирующие строки, получившиеся после применения WHERE, но это не значит, что будут перебираться все строки исходной таблицы. ugin_root,Мелкий
Разумеется. Было бы очень странно, если бы прямая выборка по ключу была медленнее выборки через LIMIT. Я не утверждал, что выборка по id будет медленнее, я вообще не рассматривал этот случай. Я сказал лишь про тот случай, когда выборка нужных строк может быть предопредена явно.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
tuareg
Отправлено: 23 Февраля, 2012 - 18:40:06
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
EuGen А можно ссылку где про это почитать поподробнее?
Мелкий
Отправлено: 23 Февраля, 2012 - 18:53:33
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
EuGen пишет:
Было бы очень странно, если бы прямая выборка по ключу была медленнее выборки через LIMIT.
Я сравнивал 3 разных запроса.
limit 1999998,1
limit 1
where по PK
Добавил в сравнение ещё:
limit 49999,1
limit 999998,1
limit 149999,1
Закономерность времени выборки совершенно линейна по увеличению оффсета и на 2млн строк составляет 1.5с - достаточно, чтобы уловить разницу.
Напомню, что проверяю я на тупом select * from `tbl` limit n,1
----- PostgreSQL DBA
Champion
Отправлено: 23 Февраля, 2012 - 19:10:27
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
EuGen пишет:
Во-первых, речь не о "каком угодно наборе", а о
snikers987 пишет:
SELECT * FROM `table` LIMIT 999, 1
Ну на опытах Мелкого и такой запрос никак не оптимизируется. И в експлейне никакого намека на оптимизацию. И в том же експлейне предполагаемое количество обрабатываемых строк сопоставимо с цифрой Х в выражении LIMIT X,1.
EuGen пишет:
LIMIT - это частный случай HAVING
Никогда об этом не задумывался, но по сути да, так и есть. Но дело в том, что ХЭВИНГ применяется так же к получившемуся набору после всех остальных опираций и никогда не думает пользоваться ни индексом, ни чем-то похожим.
MySQL 5.1. Вот (Добавление)
... Однако, с myisam limit всё-таки, похоже, оптимизируется, да.
С InnoDB - нет.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.