Мне нужна помощь в некоторых запросах mysql, я пытаюсь улучшить его производительность и скорость
Я пытаюсь понять, как это сделать, используя синтаксис mysql.
вот фрагмент функции запроса, которую я использую в php-скрипте статистики, чтобы получить информацию о некоторых странах посетителей.
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) второй запрос, который подсчитывает загрузки для каждой группы, он используется для поиска во всей таблице посетителей не только в группе этой страны, что также снижает производительность.
Итак, есть ли хорошее решение для этих двух проблем, чтобы сделать только один запрос, который предоставит страны в группах по именам и их общему количеству, а также загрузкам из каждой группы и будет быстрее и даст лучшую производительность?
любая помощь действительно ценится, спасибо
ВЫБЕРИТЕ c.country, c.code, COUNT (v.id) КАК общее количество из страны c INNER JOIN посетители v ON (c.country = v.country) WHERE v.download = 1 GROUP BY v.country ORDER BY total DESC;
Ваши потенциально сотни запросов объединены в один :). Конечно, вы должны убедиться, что у вас есть правильные индексы для обеих таблиц.