Оптимизация запросов PHP / MySQL? - PullRequest
0 голосов
/ 15 августа 2011

У меня есть запрос, который работает так, как он должен, однако я хочу оптимизировать его, чтобы использовать меньше запросов.

Следующий код взят из плагина пользовательских медалей, который я создаю для доски объявлений.system.

$types = array('numposts', 'numthreads', 'numreps');
$medals = "";

foreach($types as $type)
{
    $query = $db->query("
        SELECT u.*, m.* 
        FROM ".TABLE_PREFIX."medals_".$type." m
        LEFT JOIN ".TABLE_PREFIX."medals u ON (m.".$type."_id=u.awid)
        WHERE awuid='".intval($post['uid'])."' AND type='".$type."'
        ORDER BY `".$type."` DESC LIMIT 1
    "); 

    while($results = $db->fetch_array($query))
    {
        $medals .= "<img src=\"uploads/medals/".$results['icon']."\" border=\"0\" alt=\"".$results['descrition']."\" title=\"".$results['description']."\" /> ";
    }
}

Для каждого сообщения он запускает этот запрос для отображения медалей пользователя.В зависимости от количества постов запрос умножается на три.Так, например, если в потоке 10 сообщений ... 10x3 - это 30 ... это 30 запросов, выполняемых только этим кодом.

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

1 Ответ

1 голос
/ 15 августа 2011

Ссылка в таблице сообщений, так что вы можете получить медали только для тех пользователей, чьи сообщения действительно отображаются. Если вы выполните этот запрос отдельно, вы получите только 1 запись списка медалей на пользователя, которую вы можете сохранить в массиве или другой переменной.

Когда вы начнете отображать сообщения, вы можете вернуться к списку медалей и открыть медали пользователя. Если (скажем) в ваших 10 сообщениях было только 2 человека в чате, это стоило бы вам одного запроса, который выбирает 2x3 = 6 строк данных (2 пользователя x 3 типа медалей) и некоторую память для хранения результатов медалей, пока вы на самом деле извлекать / отображать сообщения.

...