Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: оптимизация кода
 
 автор: XP   (20.11.2007 в 00:40)   письмо автору
 
 


<?
  $actions 
= array ("join""logon""logon_first""forum_quest_add""forum_answer_add""pascal_done",
 
"pascal_mark""pascal_foul""pascal_more""pascal_start""gtest_start""gtest_finish""gtest_cancel"
 
"gtest_zero""strike_page""login_remaind""send_email""sms_send");
  
$intervals = array ("and LEFT(ActionDate, 10) = LEFT(NOW(), 10)"
                                   
"and LEFT(ActionDate, 10) = LEFT(NOW() - INTERVAL 1 DAY, 10)"
                                   
"and LEFT(ActionDate, 10) > LEFT(NOW() - INTERVAL 7 DAY, 10)"
                                   
"and LEFT(ActionDate, 10) > LEFT(NOW() - INTERVAL 1 MONTH, 10)"
                                    
"");
  foreach (
$actions as $action)
  {
      ...
     foreach (
$intervals as $interval)
     {
       
$query "SELECT COUNT(Action) AS Logins
                         FROM Action
                         WHERE Action = '
$action$interval";
       
$res $sql -> query ($query$rows);
       
$row mysql_fetch_assoc ($res);
         ...
     }
      ...
  }
?>

Вот есть код. Проблема в том, что там получается 18 * 5 = 90 запросов. Страничка уж очень долго грузит, можно ли как-нибудь оптимизировать данный код?

   
 
 автор: exp   (20.11.2007 в 03:07)   письмо автору
 
   для: XP   (20.11.2007 в 00:40)
 

интересная тема
попробуйте запустить такие два варианта , если получится, напишите пожалста какой из них быстрее
ато не нажил я ещё больших таблиц потестить )

вот так кажется должно получиться
<html><body><table border="2px">
<?php

list($headtime$time) = explode(chr(32), microtime());
$headtime = ($time $headtime);  # время начала

define('Z'"\n");
define('TD''<td></td>' Z);
define('TR''<tr><td>' Z);
define('TDR''</td></tr>' Z);
        
// include('');

$actions = array("join""logon""logon_first""forum_quest_add"
    
"forum_answer_add""pascal_done"
     
"pascal_mark""pascal_foul""pascal_more""pascal_start"
    
"gtest_start""gtest_finish""gtest_cancel",  
     
"gtest_zero""strike_page""login_remaind""send_email"
    
"sms_send"); 
$intervals = array("and LEFT(ActionDate, 10) = LEFT(NOW(), 10)",  
            
"and LEFT(ActionDate, 10) = LEFT(NOW() - INTERVAL 1 DAY, 10)",  
            
"and LEFT(ActionDate, 10) > LEFT(NOW() - INTERVAL 7 DAY, 10)",  
            
"and LEFT(ActionDate, 10) > LEFT(NOW() - INTERVAL 1 MONTH, 10)"
    
""); 
    
for(
$i=0$i<count($actions); $i++) 
  { 
    
$query 'SELECT COUNT(NULLIF(Action = "' $action[$i] . '" ' $intervals[0] . ', 0)) AS Logins0,
        COUNT(NULLIF(Action = "' 
$action[$i] . '" ' $intervals[1] . ', 0)) AS Logins1,
        COUNT(NULLIF(Action = "' 
$action[$i] . '" ' $intervals[2] . ', 0)) AS Logins2,
    COUNT(NULLIF(Action = "' 
$action[$i] . '" ' $intervals[3] . ', 0)) AS Logins3,
    COUNT(NULLIF(Action = "' 
$action[$i] . '", 0)) AS Logins4
        FROM Action'

        
           
$res $sql -> query($query$rows); //
    
$row mysql_fetch_row($res); 
    
     echo 
TR $action[$i] . TD $row[0] . TD $row[1] . TD 
               
$row[2] . TD $row[3] . TD $row[4] . TDR ;     
  } 

        
// mysql_close();
            
list($msec,$sec) = explode(chr(32), microtime()); #время завершения 
echo  '<tr><td colspan="6">' '[_' round(($sec $msec) - $headtime4) . 's_]' TDR ;
        
?>
</table></body></html>

и наверное так
<html><body><table border="2px">
<?php

list($headtime$time) = explode(chr(32), microtime());
$headtime = ($time $headtime);  # время начала

define('Z'"\n");
define('TD''<td></td>' Z);
define('TR''<tr><td>' Z);
define('TDR''</td></tr>' Z);
        
// include('');

$actions = array("join""logon""logon_first""forum_quest_add"
    
"forum_answer_add""pascal_done"
     
"pascal_mark""pascal_foul""pascal_more""pascal_start"
    
"gtest_start""gtest_finish""gtest_cancel",  
     
"gtest_zero""strike_page""login_remaind""send_email"
    
"sms_send"); 
$intervals = array("and LEFT(ActionDate, 10) = LEFT(NOW(), 10)",  
            
"and LEFT(ActionDate, 10) = LEFT(NOW() - INTERVAL 1 DAY, 10)",  
            
"and LEFT(ActionDate, 10) > LEFT(NOW() - INTERVAL 7 DAY, 10)",  
            
"and LEFT(ActionDate, 10) > LEFT(NOW() - INTERVAL 1 MONTH, 10)"
    
""); 
    
$count count($actions) - 1;    
$query '';

for(
$i=0$i <= $count$i++) 
  { 
    
$query .= 'SELECT COUNT(NULLIF(Action = "' $action[$i] . '" ' $intervals[0] . ', 0)) AS Logins0,
        COUNT(NULLIF(Action = "' 
$action[$i] . '" ' $intervals[1] . ', 0)) AS Logins1,
        COUNT(NULLIF(Action = "' 
$action[$i] . '" ' $intervals[2] . ', 0)) AS Logins2,
    COUNT(NULLIF(Action = "' 
$action[$i] . '" ' $intervals[3] . ', 0)) AS Logins3,
    COUNT(NULLIF(Action = "' 
$action[$i] . '", 0)) AS Logins4
        FROM Action 
        '
;
    if (
$i != $count$query .= 'UNION ALL
    '

  }
        
$res $sql -> query($query$rows); // запрос

while($row mysql_fetch_row($res)) 
{    
     echo 
TR $action[$i] . TD $row[0] . TD $row[1] . TD 
               
$row[2] . TD $row[3] . TD $row[4] . TDR ;     


        
// mysql_close();
            
list($msec,$sec) = explode(chr(32), microtime()); #время завершения 
echo  '<tr><td colspan="6">' '[_' round(($sec $msec) - $headtime4) . 's_]' TDR ;
        
?>
</table></body></html>

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования