SQL

Статус
В этой теме нельзя размещать новые ответы.
Я бы скрипт переписал так. И в указанных местах сделал бы замеры.
Код:
<?php
session_start();

include("include/config.php");
include("include/function.php");

$err = "";
if (!isset($_REQUEST['UID']) || empty($_REQUEST['UID'])) {
    $err="{$language[541]}";
} else {
    if($_REQUEST['type']!="private") $_REQUEST['type']="public";
    if($page=="") $page = 1;
    $uuu = $_REQUEST['UID'];
    $ttt = $_REQUEST['type'];
    $sql = "SELECT COUNT(*) AS total".
        " FROM media".
        " WHERE media_type = 'video'".
        " AND active = '+'".
        " AND UID = '{$uuu}'".
        " AND type='{$ttt}'".
        " LIMIT '{$config['total_per_ini']}'";
    // Начало замера 1 ---------------------------------------
    $ars = $conn->Execute($sql);
    // Конец замера 1 ----------------------------------------
    $total = $config['total_per_ini'];
    if ($ars->fields['total'] <= $total) {
        $total = $ars->fields['total'];
    }
    $tpage = ceil($total/$config['items_per_page']);
    $spage = $tpage;
    if(0 == $spage) {
        $spage = $tpage + 1;
    }
    $startfrom = ($page-1) * $config['items_per_page'];
    $sql="SELECT * FROM media".
        " WHERE media_type = 'video'".
        " AND active = '+'".
        " AND UID='{$uuu}'".
        " AND type='$ttt'".
        " ORDER BY VID DESC".
        " LIMIT '{$startfrom}', '{$config['items_per_page']}'";
    // Начало замера 2 ---------------------------------------
    $rs = $conn->Execute($sql);
    // Конец замера 2 ----------------------------------------
    if($rs->recordcount() > 0) {
        $vdo = $rs->getrows();
    }
    $start_num = $startfrom + 1;
    $end_num = $startfrom + $rs->recordcount();
    $page_link = "";
    for($k=1;$k <= $tpage; $k++) {
        $page_link .= "<a style='text-decoration:none'".
            " href='uvideos.php?UID={$_REQUEST['UID']}".
            "&page={$k}&type={$_REQUEST['type']}'>";
        if ($k == $page) {
            $page_link .= "[<b>{$k}</b>]</a>&nbsp;&nbsp;"; 
        } else { 
            $page_link .= "{$k}</a>&nbsp;&nbsp;";
        }
    }
    // Начало замера 3 ---------------------------------------
    $kwords = my_tags($_REQUEST['UID']);
    // Конец замера 3 ----------------------------------------
}

STemplate::assign('head_bottom',"viewuserlinks.tpl");
STemplate::display('head1.tpl');
if (!empty($err)) {
    STemplate::assign('err',$err);
    STemplate::display('err_msg.tpl');
} else {
    STemplate::assign('msg',$msg);
    STemplate::assign('page',$page);
    STemplate::assign('start_num',$start_num);
    STemplate::assign('end_num',$end_num);
    STemplate::assign('page_link',$page_link);
    STemplate::assign('total',$total);
    STemplate::assign('answers',$vdo);
    STemplate::assign('vtags',$kwords);
    // Начало замера 4 ---------------------------------------
    STemplate::display('uvideos.tpl');
    // Конец замера 4 ----------------------------------------
}
STemplate::display('footer.tpl');

?>
 
Oops....Fatal error: Call to a member function on a non-object in .......\uvideos.php on line 45
if($rs->recordcount() > 0) {
$vdo = $rs->getrows();

не нравится ему '{$startfrom}', '{$config['items_per_page']}'

сделал так $sql="SELECT * FROM media WHERE media_type = 'video' AND active = '+' AND UID='{$uuu}' AND type='$ttt' ORDER BY VID DESC LIMIT $startfrom,$config[items_per_page]"; чтобы не считать кавычки - теперь говорит "видео нет"
 
Код:
<?php
session_start();

include("include/config.php");
include("include/function.php");

$err = "";
if (!isset($_REQUEST['UID']) || empty($_REQUEST['UID'])) {
    $err="{$language[541]}";
} else {
    if($_REQUEST['type']!="private") $_REQUEST['type']="public";
    if($page=="") $page = 1;
    $uuu = $_REQUEST['UID'];
    $ttt = $_REQUEST['type'];
    $sql = "SELECT COUNT(*) AS total".
        " FROM media".
        " WHERE media_type = 'video'".
        " AND active = '+'".
        " AND UID = $uuu".
        " AND type='$ttt'".
        " LIMIT $config[total_per_ini]";
    // Начало замера 1 ---------------------------------------
    $ars = $conn->Execute($sql);
    // Конец замера 1 ----------------------------------------
    $total = $config['total_per_ini'];
    if ($ars->fields['total'] <= $total) {
        $total = $ars->fields['total'];
    }
    $tpage = ceil($total/$config['items_per_page']);
    $spage = $tpage;
    if(0 == $spage) {
        $spage = $tpage + 1;
    }
    $startfrom = ($page-1) * $config[items_per_page];
    $sql="SELECT * FROM media".
        " WHERE media_type = 'video'".
        " AND active = '+'".
        " AND UID=$uuu".
        " AND type='$ttt'".
        " ORDER BY VID DESC".
        " LIMIT $startfrom, $config[items_per_page]";
    // Начало замера 2 ---------------------------------------
    $rs = $conn->Execute($sql);
    // Конец замера 2 ----------------------------------------
    if($rs->recordcount() > 0) {
        $vdo = $rs->getrows();
    }
    $start_num = $startfrom + 1;
    $end_num = $startfrom + $rs->recordcount();
    $page_link = "";
    for($k=1;$k <= $tpage; $k++) {
        $page_link .= "<a style='text-decoration:none'".
            " href='uvideos.php?UID={$_REQUEST['UID']}".
            "&page={$k}&type={$_REQUEST['type']}'>";
        if ($k == $page) {
            $page_link .= "[<b>{$k}</b>]</a>&nbsp;&nbsp;"; 
        } else { 
            $page_link .= "{$k}</a>&nbsp;&nbsp;";
        }
    }
    // Начало замера 3 ---------------------------------------
    $kwords = my_tags($_REQUEST['UID']);
    // Конец замера 3 ----------------------------------------
}

STemplate::assign('head_bottom',"viewuserlinks.tpl");
STemplate::display('head1.tpl');
if (!empty($err)) {
    STemplate::assign('err',$err);
    STemplate::display('err_msg.tpl');
} else {
    STemplate::assign('msg',$msg);
    STemplate::assign('page',$page);
    STemplate::assign('start_num',$start_num);
    STemplate::assign('end_num',$end_num);
    STemplate::assign('page_link',$page_link);
    STemplate::assign('total',$total);
    STemplate::assign('answers',$vdo);
    STemplate::assign('vtags',$kwords);
    // Начало замера 4 ---------------------------------------
    STemplate::display('uvideos.tpl');
    // Конец замера 4 ----------------------------------------
}
STemplate::display('footer.tpl');

?>

Изменил - ожило. Сейчас поставлю на сервер и померяю время

Добавлено через 41 минуту
Та же история :
первый запрос
time 1 -> 0.002107 sec | time 2 -> 0.001143 sec | time 3 -> 4.996019 sec | time 4 -> 0.261805 sec |

рефреш (или переход на соседнюю страницу 'раge' в коде)
time 1 -> 0.000212 sec | time 2 -> 0.000227 sec | time 3 -> 0.002887 sec | time 4 -> 0.174676 sec |

через несколько (1-2) минут рефреш
time 1 -> 0.002069 sec | time 2 -> 0.003174 sec | time 3 -> 10.962978 sec | time 4 -> 0.145076 sec |

топ говорит что свапа нет, хотя память напихана на 90% - может врёт? Зато теперь даже мне понятно что смарти непричём.
 
и самое непонятное : есть страничка с одними тегами , функция запроса практически та же
Код:
function top_tags($query, $num = 20)
{
  global $conn;
  $query = "select t.keyword, count(t2m.VID) as total from tags t left join tag2media t2m on t2m.TID = t.id group by t.keyword order by total desc limit $num";

  $rs=$conn->execute($query);
  
  $rankedResult = $rs->getarray();

  $numLayers = 4;
  $type = 1;
  $resultset = array();

  for($i=0; $i < count($rankedResult);$i++)
  {
    $resultset[$i] = array();
    $resultset[$i][0] = $rankedResult[$i]['keyword'];
    
    if ($i < $numLayers + 1)
      $resultset[$i][1] = 1;
    elseif ($i < $numLayers * 2 + 2)
     $resultset[$i][1] = 2;
    elseif ($i < $numLayers * 3 + 3)
      $resultset[$i][1] = 3;
    else  
      $resultset[$i][1] = 4;
  }
  shuffle($resultset);
  
  
  return $resultset;
}
никогда даже не пытается тормозить - летает.
Может всё-таки просто не хватает памяти и оно втихаря свопится или ещё что-нибудь полезное делает?
 
Проблема в запросе в my_tags();
Код функции я переписал так, хотя это не столь важно.
Код:
function my_tags($uid)
{
    global $conn;
    $list = array();
    $query = "SELECT DISTINCT t.keyword".
        " FROM tags t".
        " LEFT JOIN tag2media t2m ON t2m.TID=t.id".
        " LEFT JOIN media m ON t2m.VID=m.VID".
        " WHERE m.UID='{$uid}'".
        " ORDER BY t.keyword ASC";
    $rs = $conn->execute($query);
    while(!$rs->EOF) {
        $list[] = $rs->fields['keyword'];
        $rs->movenext();
    }
    return $list;
}
Главное, я бы сделал индекс для поля keyword в таблице tags. Кроме того проверил, есть ли индексы у полей, по которым делается LEFT JOIN. На своп не похоже. 100% проблема в запросе к БД.

Страницу смотрел. ;)
 
Лично я бы в таком случае убрал LEFT JOIN'ы и написал склейку таблиц на php.
 
tov_Me, тоесть ты заявляешь, что нормализация баз данных - это отстой, а одна говнотаблица дублирующая говноданные это твой идеал?
Автар, выпей йаду! Убей себя ап стену! :D
 
Я предупреждал что я многого не понимаю.:nezn:
Вроде как всё проиндексировано,
media- vid
tags - tid
tag2media id
единственное - после реальной работы некоторые видео стёрты и индексное поле "c дырками" - т.е. после редактирования переиндексация не делается. может нужно ввести дополнительное "чистое" индексное поле где всё поряд?
 
тоесть ты заявляешь, что нормализация баз данных - это отстой, а одна говнотаблица дублирующая говноданные это твой идеал?
Автар, выпей йаду! Убей себя ап стену! :D
У меня нет никаких идеалов. Вот у тебя наверно есть какой-то говноидеал :D
Наиболее требовательными запросами к таблице являются всякие JOINы - это общеизвестная истина, о которой даже в учебниках пишут. Я не говорил, что индексирование не нужно. Я сказал, что склейка средствами MySQL больно тормозная.
 
to gimmoВот на этом я сделал акцент. Темболее в запросе ты пытаешься сортировать по этому, да ещё с поддержкой уникальности.
Главное, я бы сделал индекс для поля keyword в таблице tags.


Добавлено через 5 минут
Наиболее требовательными запросами к таблице являются всякие JOINы - это общеизвестная истина, о которой даже в учебниках пишут. Я не говорил, что индексирование не нужно. Я сказал, что склейка средствами MySQL больно тормозная.
Гы. Зачем тогда эти JOINы создали? Ради мазохизма программистов? А упор на то, что MySQL тормознутый на них - это ложь. Правда в правильном создании индексов. MySQL самая быстрая на сегодняшний день БД. Так что оставь свои фантазии себе. :D
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху