Долгий mysqli запрос

350
29 октября 2017, 20:38

Имеется таблица alog с содержанием:

  id  || userid || text
================================
  1   || 12000  || действие1
...
15014 || 49621  || дейтсвие15014
...
32194 ||  6700  || действие32194

Соответственно, более 32 тысяч строк.

Обращаюсь к таблице:

$request=$mysqli->query("
SELECT `alog`.`text`,`users`.`login`,`alog`.`userid` 
FROM `alog` 
JOIN `users` 
ON `alog`.`userid`=`users`.`id` 
ORDER BY `alog`.`id` DESC 
LIMIT 6
");

Затем обрабатываю для каждой строки:

for($i=0;$i<mysqli_num_rows($request);$i++) 
{
   $rows=$request->fetch_assoc();
   echo '<p class="category">'.$rows['login'].' - '.$rows['text'].'</p>';
}

Запрос выполняется несколько секунд.

Какие есть способы сократить время выполнения запроса к таблице с большим количеством строк? Возможно, какие-то дополнительные библиотеки.

Answer 1

Попробуйте переписать запрос так:

SELECT `alog`.`text`,`users`.`login`,`alog`.`userid` 
  FROM (select * from alog order by id desc limit 6) `alog`
  JOIN `users`
    ON `alog`.`userid`=`users`.`id` 
 ORDER BY `alog`.`id` DESC 

В вашем изначальном запросе MySQL сначала получает все записи из alog, подбирает подходящих для них пользователей и только после этого сортирует всю выборку и берет первые 6 записей.

В варианте с подзапросом, MySQL сначала получает 6 записей, причем скорее всего использует индекс по полю id и не проходит по всей таблице и даже не использует сортировку, так как из индекса записи выбираются сразу в нужном порядке. И только после этого подбирает подходящих пользователей именно для этих 6 записей.

READ ALSO
Как получить значения поля типа enum в yii2

Как получить значения поля типа enum в yii2

В таблице бд есть поле типа enumНужно получить все возможные значения этого поля

288
Слетает язык после завершения сессии

Слетает язык после завершения сессии

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

253
php подключение файла в таблицу

php подключение файла в таблицу

Здравствуйте, возникла такая проблема имеются три одинаковых таблицы, содержимое которых подключается из другого файла php, но почему то содержимое...

282
Как запустить node.js и apache(php) на одном порту?

Как запустить node.js и apache(php) на одном порту?

Я хочу сделать чат на сокетах с помощью Nodejs на apache

308