Оптимизировать производительность и скорость запросов MySQL
Мне нужна помощь в некоторых запросах MySQL Я пытаюсь улучшить его производительность и скорость
Я пытаюсь выяснить, как сделать это с помощью синтаксиса MySQL.
Вот фрагмент функции запроса, которую я использую в php-скрипте stats для получения информации о посетителях в некоторых странах.
function countries() {
$countryname = array();
$countrycode = array();
$countrytotal = array();
$countrydownloads = array();
$countryrate = array();
$countries = query ("SELECT country,code, count(*) as total FROM visitors group by country order by total DESC");
while ($country = mysql_fetch_array($countries))
{
$download = query("SELECT COUNT(id) as total FROM visitors WHERE download = 1 and country = '$country[country]';");
if(mysql_num_rows($download) == 0) {$downloads[0] = 0;} else { $downloads = mysql_fetch_array($download); }
$rate = intval( ($downloads[0] * 100) / $country[total])." %";
array_push($countryname,$country[country]);
array_push($countrytotal,$country[total]);
array_push($countrydownloads,$downloads[0]);
array_push($countryrate,$rate);
array_push($countrycode,$country[code]);
}
return array($countryname,$countrytotal,$countrydownloads,$countryrate,$countrycode); }
В запросе сначала собраны все страны из таблицы посетителей в группах по имени. затем он собирает загрузки для каждой группы, полученные в результате первого запроса.
Моя проблема в том, что если в таблице посетителей есть записи 150 различных стран, группирующих их по имени, то она собирает загрузки для каждой группы, если каждый запрос группы стран займет 0,5 секунды, общая функция займет 150 * 0,5 = 75 секунд, что слишком плохая и очень медленная скорость выполнения запросов.
Итак, есть 2 проблемы:
1) я выполняю отдельный запрос для первой функции, которая будет возвращать только названия стран в группах, затем выполняю другой отдельный запрос для сбора загрузок из каждой страны, используя цикл php, который занимает больше времени при наличии большого количества групп.
2) второй запрос, который подсчитывает количество загрузок для каждой группы, используется для поиска в записях всей таблицы посетителей не только в группе этой страны, что также снижает производительность.
Так есть ли какое-то хорошее решение для этих двух проблем, чтобы сделать только один запрос, который даст странам в группах по именам и общему количеству их, а также загрузкам из каждой группы и будет быстрее и даст лучшую производительность?
любая помощь очень ценится, спасибо
1 ответ
ВЫБЕРИТЕ c.country, c.code, COUNT(v.id) КАК ВСЕГО ИЗ СТРАНЫ c ВНУТРЕННИЕ ПРИСОЕДИНЯЙТЕСЬ Посетители v ON (c.country = v.country) ГДЕ v.download = 1 GROUP BY v.country ORDER BY total DESC;
Ваш потенциально сотни запросов объединены в один:). Конечно, вы должны убедиться, что у вас есть правильные индексы для обеих таблиц.