2016-03-01 3 views
0

Я хочу, чтобы получить первую и последнюю строку в таблице, и я нашел 2 способа сделать это:Сколько времени в Laravel?

$first = DB::table('shops')->first(); 
$last = DB::table('shops')->orderBy('id','DESC')->first(); 

И:

$shops = DB::table('shops')->get(); 
$first2 = $shops[0]; 
$last2 = $shops[count($shops)-1]; 

Мой вопрос, в каком направлении работать быстрее с той же БД ? или каким-либо образом время запроса журнала?

DB может быть, большие, 1.000 строк, 10.000 строк, и т.д., ...

+0

Первый пример будет быстрее. Потому что вы получаете только две записи. В последнем примере будут получены все записи, которые в вашем примере могут быть тысячами записей. Это огромная разница во времени загрузки страницы. –

+0

Это все, что я думаю, но я не уверен, что это правда, из-за 'orderBy' также сортировать все строки. –

+0

Я уверен, что это правда. –

ответ

2

Около 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 

Похоже, что с подзапросом время запроса выполняется быстрее.

+0

Принимает '184.67ms' больше. Что огромно для двух запросов, пытающихся получить тот же результат. –

+0

Отлично с красивым примером. Большое спасибо. –

+0

@rome 웃 Добро пожаловать, я обновил третий способ. Нужно больше тестов, чтобы узнать, что быстрее – Chung

1

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

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

Второй загружает все ваши строки в массив, а затем вы захватываете первый и последний, с 1000 до 10000 строк, это может занять довольно много времени.

Вы всегда можете попробовать запустить запросы вручную и посмотреть, сколько времени они берут для загрузки, чтобы получить реальную разницу.

Вы можете получить точный SQL-код, добавив toSql() до конца красноречивого запроса.

1

Как я уже сказал, первый пример будет быстрее. Потому что вы получаете только две записи. В последнем примере будут получены все записи, которые в вашем примере могут быть тысячами записей. Это огромная разница во времени загрузки страницы.

Если вы хотите посмотреть, как долго ваша загрузка страницы, вы можете проверить barryvdh/laravel-debugbar. Это даст отличную информацию о всех вещах, включая время загрузки страницы.