trevoga_su
@trevoga_su

Как mySQL работает с таким запросом?

select * from messages limit 0, 50
Explain запроса показывает, что mysql затрагивает все записи из таблицы.
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra 	
1 	SIMPLE 	a 	ALL 	NULL	NULL	NULL	NULL	24322


У кого-нибудь есть понимание внутренней работы базы по данному запросу? Насколько это операция станет трудозатратной на десятках-сотнях тыс. записей?
  • Вопрос задан
  • 154 просмотра
Пригласить эксперта
Ответы на вопрос 4
wladyspb
@wladyspb
Программист
Насколько я знаю, он НЕ ДОЛЖЕН затрагивать всю базу, если вы конечно не добавляли ORDER BY. Однако с лимитом есть определённая проблема - если вы делаете выборку "LIMIT 100, 10" то мускул выдернет 110 записей, и отдаст 10 последних. Вот тут подробнее на эту тему, если хочется ознакомиться: habrahabr.ru/post/217521
Ответ написан
Комментировать
He11ion
@He11ion
PHP-monkey
Естественно, все. Вы же не ставите ограничений по выборке данных. Нет, такой конкретно запрос тормозить не будет (ну или не должен по крайней мере).
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Поскольку нет order by и даже where, да по нулевому offset - запрос крайне лёгкий, тупое последовательное чтение.
Вопрос в том, вам действительно нужны просто любые 50 строк таблицы? Запрос может вернуть буквально любые строки, в любом порядке, на каждый запрос ответ может различаться.
Ответ написан
Комментировать
@hurgadan
Да, все записи. При выполнении запроса MySQL выбирает все, а вот результат выдан будет только тот что указан в LIMIT. Поэтому запрос
select * from table limit 0, 50
будет выполнятся быстрее чем запрос
select * from table limit 50000 , 50
MySQL переберет и отбросит все записи таблицы до 50000 записи и только затем выдаст нужные 50.
Соответственно чем у вас в таблице больше записей и больше смещение, тем дольше будет выполнятся запрос.
Используйте ORDER BY совместно с LIMIT, это будет быстрее, как-то так:
select * from table 
       JOIN (select id from table order by id limit 50000, 50) as a ON table.id = a.id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы