Назад | Перейти на главную страницу

оптимизировать производительность и скорость запросов mysql

Мне нужна помощь в некоторых запросах 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;

Ваши потенциально сотни запросов объединены в один :). Конечно, вы должны убедиться, что у вас есть правильные индексы для обеих таблиц.