Около 8000 строк, вот результаты:
Первый способ:
[2016-03-01 19:14:11] local.DEBUG: select * from `shops` limit 1; in 1.27 ms
[2016-03-01 19:14:11] local.DEBUG: select * from `shops` order by `id` desc limit 1; in 3.04 ms
Второй способ:
local.DEBUG: select * from `shops`; in 188.98 ms
Вы можете видеть, что второй способ полностью медленнее, чем первый.
Потому что во втором случае вы должны получить все записи из таблицы магазинов. Это занимает много раз.
Для большего набора данных, я думаю, что второй способ не будет работать из-за таймаута в запросе.
Обновление:
Просто для другого эксперимента.
я попробовать третий способ решить вашу проблему в одном запросе, как следующее:
$shops = DB::table('shops')
->whereRaw('id = (SELECT MIN(id) from shops)')
->orWhereRaw('id = (Select MAX(id) from shops)')
->get();
И я сравниваю с первым способом. И вот результат:
# the 3rd way
[2016-03-01 19:51:56] local.DEBUG: select * from `shops` where id = (SELECT MIN(id) from shops) or id = (Select MAX(id) from shops); in 1.04 ms
# the 1st way
[2016-03-01 19:52:02] local.DEBUG: select * from `shops` limit 1; in 0.67 ms
[2016-03-01 19:52:02] local.DEBUG: select * from `shops` order by `id` desc limit 1; in 0.5 ms
Похоже, что с подзапросом время запроса выполняется быстрее.
Первый пример будет быстрее. Потому что вы получаете только две записи. В последнем примере будут получены все записи, которые в вашем примере могут быть тысячами записей. Это огромная разница во времени загрузки страницы. –
Это все, что я думаю, но я не уверен, что это правда, из-за 'orderBy' также сортировать все строки. –
Я уверен, что это правда. –