Запрос происходит очень долго php, mysql

при таком коде скрипт очень долго грузится (4,5 секунд)

$findresdecoder = mysqli_query($cfg->get_connection(),"SELECT * FROM `harddecoder` WHERE `vk_id`='".$vkkid."' ORDER BY `id` DESC LIMIT 25");

while($row=mysqli_fetch_array($findresdecoder)){

                $hash=$row['hash'];
                
                $findhashdb = mysqli_query($cfg->get_connection(),"SELECT COUNT(*) FROM `harddecoder` WHERE `hash`='".$hash."'");
                $findhash=mysqli_fetch_assoc($findhashdb);

}

А именно при строке

$findhashdb = mysqli_query($cfg->get_connection(),"SELECT COUNT(*) FROM `harddecoder` WHERE `hash`='".$hash."'");

внутри while. Есть ли способы этот код оптимизировать, и как?


Ответы (1 шт):

Автор решения: Eugene X
  1. Сделать 1им запросом....
  2. Расставить индекс на harddecoder.hash
<?php
$in = ["hash1", "hash2", "hash3"];
$join = '("' . join($in, '","') . '")'

$SQL = <<< END_SQL
SELECT COUNT(*)
FROM `harddecoder`
WHERE `hash` IN $join
GROUP BY `hash`
END_SQL;

Добавлено чуток спустя:

Вот полный пример как всё собрать, с помощью 1 запроса на примере TryIt editor https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc

SELECT Country, COUNT(a.Country) as "CountTotal"
FROM
    (SELECT c.Country FROM Customers as "c" ORDER BY c.PostalCode DESC LIMIT 25) as "a"
GROUP BY a.Country
ORDER BY CountTotal DESC
→ Ссылка