Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: LIMIT в mysql

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: как все же он работает?
snikers987
Отправлено: 23 Февраля, 2012 - 14:57:20
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `table` LIMIT 999, 1

Как обтработает этот запрос?
Произойдет выборка 1000 записей и возврат 1 , либо же первые 999 будут пропущены? Подозреваю что верно первое предположение, но все же, как?


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Uchenik
Отправлено: 23 Февраля, 2012 - 15:02:31
Post Id



Частый гость


Покинул форум
Сообщений всего: 187
Дата рег-ции: Авг. 2011  


Помог: 1 раз(а)




Первый параметр с какой записи, а второй сколько
 
 Top
snikers987
Отправлено: 23 Февраля, 2012 - 15:05:43
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




Uchenik пишет:
Первый параметр с какой записи, а второй сколько

Да не ужили? Разве в этом вопрос?


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
OrmaJever Модератор
Отправлено: 23 Февраля, 2012 - 15:21:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Скорее всего первые 999 бд пропустит. Это можно проверить замеряв время запроса
и

в первом варианте время должно быть намного меньше.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
EuGen Администратор
Отправлено: 23 Февраля, 2012 - 15:30:35
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




snikers987
MySQL < 4.1 - будет выбрано все, затем отобраны нужные ряды.
MySQL >=4.1 - СУБД сразу выберет нужное исходя из параметров LIMIT


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
snikers987
Отправлено: 23 Февраля, 2012 - 15:36:04
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




EuGen пишет:
snikers987
MySQL < 4.1 - будет выбрано все, затем отобраны нужные ряды.
MySQL >=4.1 - СУБД сразу выберет нужное исходя из параметров LIMIT

Тоесть если mysql >= 4.1 не будет диких тормозов при запросах типа

?


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
EuGen Администратор
Отправлено: 23 Февраля, 2012 - 15:37:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




snikers987
Это будет эквивалентно запросу LIMIT 1, 1000 по временным затратам


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
snikers987
Отправлено: 23 Февраля, 2012 - 15:54:03
Post Id



Участник


Покинул форум
Сообщений всего: 1239
Дата рег-ции: Сент. 2011  
Откуда: Крым


Помог: 25 раз(а)




EuGen пишет:
snikers987
Это будет эквивалентно запросу LIMIT 1, 1000 по временным затратам

Это не может не радовать. Спасибо за информацию.


-----
Когда всматриваешься в тёмную бездну, учти, что кто-то может смотреть на тебя из неё...
 
My status
 Top
Мелкий Супермодератор
Отправлено: 23 Февраля, 2012 - 16:18:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




EuGen, откуда данные? mysql 5.1.49, простой селект на таблице в 2млн записей: limit 1999998,1 существенно медленнее limit 1 и where id=1999999.


-----
PostgreSQL DBA
 
 Top
ugin_root
Отправлено: 23 Февраля, 2012 - 16:46:24
Post Id


Частый гость


Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011  
Откуда: Киргизия


Помог: 5 раз(а)




Любой лимит медленнее чем доступ по id даже LIMIT 1
Цитата:
5.1.41-log

[SQL] SELECT * FROM `test` LIMIT 10000000,1;
Affected rows: 0
Time: 1.651ms

[SQL]
SELECT * FROM `test` LIMIT 1;
Affected rows: 0
Time: 0.267ms

[SQL]
SELECT * FROM `test` WHERE id=20000001;
Affected rows: 0
Time: 0.001ms
 
 Top
Champion Супермодератор
Отправлено: 23 Февраля, 2012 - 17:55:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




EuGen пишет:
MySQL >=4.1 - СУБД сразу выберет нужное исходя из параметров LIMIT
Ээм. Это физически не может быть реализовано, потому что результирующий набор может получаться каким угодно способом и сортироваться не менее каким угодно способом. Чтоб выполнить такой Limit, надо в любом случае пробежаться по всем строкам
 
 Top
EuGen Администратор
Отправлено: 23 Февраля, 2012 - 18:30:25
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Champion
Во-первых, речь не о "каком угодно наборе", а о
snikers987 пишет:
SELECT * FROM `table` LIMIT 999, 1

- и вот это СУБД способна оптимизировать.
Во-вторых, в случае WHERE следует помнить, что LIMIT - это частный случай HAVING и он будет перебирать все результирующие строки, получившиеся после применения WHERE, но это не значит, что будут перебираться все строки исходной таблицы.
ugin_root,Мелкий
Разумеется. Было бы очень странно, если бы прямая выборка по ключу была медленнее выборки через LIMIT. Я не утверждал, что выборка по id будет медленнее, я вообще не рассматривал этот случай. Я сказал лишь про тот случай, когда выборка нужных строк может быть предопредена явно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
tuareg
Отправлено: 23 Февраля, 2012 - 18:40:06
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




EuGen А можно ссылку где про это почитать поподробнее?
 
 Top
Мелкий Супермодератор
Отправлено: 23 Февраля, 2012 - 18:53:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 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
 
 Top
Champion Супермодератор
Отправлено: 23 Февраля, 2012 - 19:10:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




EuGen пишет:
Во-первых, речь не о "каком угодно наборе", а о
snikers987 пишет:
SELECT * FROM `table` LIMIT 999, 1
Ну на опытах Мелкого и такой запрос никак не оптимизируется. И в експлейне никакого намека на оптимизацию. И в том же експлейне предполагаемое количество обрабатываемых строк сопоставимо с цифрой Х в выражении LIMIT X,1.
EuGen пишет:
LIMIT - это частный случай HAVING
Никогда об этом не задумывался, но по сути да, так и есть. Но дело в том, что ХЭВИНГ применяется так же к получившемуся набору после всех остальных опираций и никогда не думает пользоваться ни индексом, ни чем-то похожим.

MySQL 5.1. Вот
(Добавление)
... Однако, с myisam limit всё-таки, похоже, оптимизируется, да.
С InnoDB - нет.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB