SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.05.2008 14:33:41

pahan
Участник
Зарегистрирован: 11.05.2008
Сообщений: 3

Сильная перегрузка при выполнении запроса.

Здравствуйте!
У меня устаноылен форум phpBB 2.0.22 и трекер, на трекере еще установлены некоторые моды, включая и мод Медалей, медали выдаются за аплоад больше 300гб для облегчения выдачи  данной медали сделан мод, который выводит из базы список всех кому пологается даная медаль.

Но он так грузит базу что, все на какое-то время приходит в ступор.

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

Неактивен

 

#2 11.05.2008 14:38:12

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Сильная перегрузка при выполнении запроса.

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

Неактивен

 

#3 11.05.2008 14:45:02

pahan
Участник
Зарегистрирован: 11.05.2008
Сообщений: 3

Re: Сильная перегрузка при выполнении запроса.

rgbeast написал:

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

медали-награды, выдаются пользавателям форумов за те или иные заслуги.
В моем случаи выдается тем кто раздал больше 300 гб, на трекере.

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

<?php

/* Settings */

// Number of recent articles you wish to display
$medal_num_recent = 120;


define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
$current_time = (isset($_GET['time']) && $_GET['time'] == 'all') ? 0 : time();
//
// Start session management
//
$userdata = session_pagestart($user_ip, PAGE_VIEWMEMBERS);
init_userprefs($userdata);
//
// End session management
//
//
// Generate page
//
$page_title = 'В помощь модератору!';
include($phpbb_root_path . 'includes/page_header.'.$phpEx);
$template->set_filenames(array(
        'body' => 'medal_body_mod.tpl')
);
make_jumpbox('viewforum.'.$phpEx);


$sql2 = " SELECT DISTINCT tor.*, u.username, u.user_id, u.user_regdate, tr.user_id, tr.u_up_total, tr.u_down_total, tr.u_up_total/tr.u_down_total AS rat2, bl.ban_userid
        FROM ( " . BT_TORRENTS_TABLE . " tor, " . USERS_TABLE . " u LEFT JOIN " . BT_USERS_TABLE . " tr ON u.user_id=tr.user_id)LEFT JOIN " . BANLIST_TABLE . " bl ON u.user_id=bl.ban_userid
        WHERE bl.ban_userid Is Null
        AND tr.u_up_total > 322122547200
        AND (tr.u_up_total/tr.u_down_total) > 3
        ORDER BY tr.u_up_total DESC";
if( !($result2 = $db->sql_query($sql2)) )
{
        message_die(GENERAL_ERROR, "Could not query users $sql", '', __LINE__, __FILE__, $sql);
}

while($row2 = $db->sql_fetchrow($result2)) $users2[$row2['user_id']] = $row2;
if(is_array($users2))
{
        $i = 0;
        foreach($users2 as $row2)
        {   
                $query2 = "SELECT count(*)
                FROM " . MEDAL_USER_TABLE . "
                WHERE user_id = '{$row2['user_id']}'
                AND medal_id = 2";
               
                $res2 = $db->sql_query($query2);
                $res2 = $db->sql_fetchrow($res2);
                $received2 = $res2['count(*)'];
                $username2 = $row2['username'];
                $user_id2 = $row2['user_id'];
                $joined2 = create_date($lang['DATE_FORMAT'], $row2['user_regdate'], $board_config['board_timezone']);
                $ratio2 = $row2['rat2'];
                $download2 = $row2['u_down_total'];
                $upload2 = $row2['u_up_total'];
                $row_color2 = ( !($i % 2) ) ? $theme['td_color1'] : $theme['td_color2'];
                $row_class2 = ( !($i % 2) ) ? $theme['td_class1'] : $theme['td_class2'];
                if ($received2 < intval(($upload2)/322122547200)) {   
                $received2 = '<span style="color:green"><b><span style="font-size:30px">' . $received2 . '</b></span></span>';
                }
                else if ($received2 > intval(($upload2)/322122547200)){
                $received2 = '<span style="color:red"><b><span style="font-size:30px">' . $received2 . '</b></span></span>';
                }
                $template->assign_block_vars('memberrow2', array(
                        'ROW_NUMBER2' => $i + ( $start + 1 ),
                        'ROW_COLOR2' => '#' . $row_color2,
                        'ROW_CLASS2' => $row_class2,
                        'USERNAME2' => $username2,
                        'JOINED2' => $joined2,
                        'EARNED2' => intval(($upload2)/322122547200),
                        'RECEIVED2' => $received2,
                        'UP_DOWN_RATIO2' => $ratio2,
                        'UP2' => humn_size ($upload2),
                        'DOWN2' => humn_size ($download2),
                        'U_VIEWPROFILE2' => append_sid("profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . "=$user_id2"))
                );
                $i++;
        }
}

$template->pparse('body');
include($phpbb_root_path . 'includes/page_tail.'.$phpEx);


?>

Неактивен

 

#4 11.05.2008 17:52:27

pahan
Участник
Зарегистрирован: 11.05.2008
Сообщений: 3

Re: Сильная перегрузка при выполнении запроса.

удалите тему, я сам разобрался!

Неактивен

 

#5 11.05.2008 17:58:35

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: Сильная перегрузка при выполнении запроса.

А пользователей всего сколько?

Проблема здесь.

foreach($users2 as $row2)
        {   
                $query2 = "SELECT count(*)
                FROM " . MEDAL_USER_TABLE . "
                WHERE user_id = '{$row2['user_id']}'
                AND medal_id = 2";
               
                $res2 = $db->sql_query($query2);
                $res2 = $db->sql_fetchrow($res2);

Для каждого пользователя выполняется отдельный запрос.
Сделай все одним запросом.
К $sql2 привинти count(*) через GROUP BY
http://dev.mysql.com/doc/refman/5.1/en/select.html

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson