Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как переделать архив, без рекурсии 
:(
    Опции темы
JEEN
Дата 13.11.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.3.2008

Репутация: нет
Всего: 1



есть такая страница _http://battle.raponline.ru/arh/
при загрузке она несколько раз обходит  более 2х тысяч записей и составляет их вот в такую цепочку, подсчитывая количество.

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

можно как-нибудь сделать это оптимальнее? 

вот пример кода, выводящий записи по датам (из кода убрано все лишнее)

Код

<?php
    $query = "SELECT count(id) as count_y, 
                     date_format(date_end, '%Y') as date_year 
              FROM `ТАБЛИЦА` 
              GROUP BY date_year";
              
    $result = mysql_query($query) or die('error');

    while( $row = mysql_fetch_assoc($result) ) 
    {
        echo '<ul>' . $row['date_year'] . '(' . $row['count_y'] . ')';
        
        $y1 = $row['date_year'] . "-01-01 00:00:00";
        $y2 = $row['date_year'] . "-12-31 00:00:00";

        $query2 = "SELECT count(id) as count_id, 
                          date_format(date_end, '%M') as date_m, 
                          date_format(date_end, '%m') as date_mes 
                   FROM `ТАБЛИЦА` 
                   WHERE date_end  >= '" . $y1 . "' and date_end <= '" . $y2 . "' 
                   GROUP BY date_mes";
        
        $result2 = mysql_query($query2) or die('error');
        
        while( $row2 = mysql_fetch_assoc($result2) ) 
        {
            echo '<ul><li>' . dateFormatM($row2['date_mes']) . '(' . $row2['count_id'] . ')</li>';
            
            $y3 = $row['date_year'] . '-' . $row2['date_mes'] . '-01 00:00:00';
            $y4 = $row['date_year'] . '-' . $row2['date_mes'] . '-31 00:00:00';
            
            echo '<ul>';

            $query3 = "SELECT * 
                       FROM `ТАБЛИЦА` 
                       WHERE date_end  >= '" . $y3 . "' and date_end <= '" . $y4 . "' 
                       ORDER BY date_end";
            
            $result3 = mysql_query($query3) or die('error');
            
            while( $row3 = mysql_fetch_assoc($result3) ) 
                echo '<li><a href="/b' . $row3['id'] . '">' . $row3['name'] . '</a></li>';
                
            echo '</ul></ul>';
        }
        echo '</ul>';
    }


Добавлено через 2 минуты и 22 секунды
p.s. в названии темы я ошибся, код писал давно, думал делал с рекурсией, оказалось просто вложенными циклами.


PM MAIL   Вверх
ksnk
Дата 13.11.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Тоесть, на самом деле нужно получить разбивку неких событий по месяцам? В принципе - достаточно, imho, одного запроса с сортировкой по date_end... Если добавить пару полей с функциями month и year , то сразу появятся признаки начала новой секции, нужно просто сравнивать с прошлыми значениями годов и месяцев.

2000 записей - не так уж и много..., хотя если гонять все это в цикле... Индексы в таблице расставлены?

Еще мысль - записи за прошлые года часто изменяются? Можно закешировать таблицу на прошлые года и сократить вычислительную часть.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
JEEN
Дата 13.11.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 8.3.2008

Репутация: нет
Всего: 1



Цитата

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

да

Цитата

В принципе - достаточно, imho, одного запроса с сортировкой по date_end... Если добавить пару полей с функциями month и year , то сразу появятся признаки начала новой секции, нужно просто сравнивать с прошлыми значениями годов и месяцев.

можно с примером? никогда так не делал...

Цитата

Индексы в таблице расставлены?

PRIMARY KEY  (`id`) это же индекс?)

Цитата

Еще мысль - записи за прошлые года часто изменяются?

вообще не меняются, часто меняются записи за последние 2 месяца.

Цитата

Можно закешировать таблицу на прошлые года и сократить вычислительную часть.

мои познания в mysql видимо очень слабые)) можете подсказать как это сделать?

и какой вариант в моем случае будет оптимальным?

Это сообщение отредактировал(а) JEEN - 13.11.2010, 12:38
PM MAIL   Вверх
ksnk
Дата 13.11.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Что-то такое:
Код

<?php 
$query = "SELECT`ТАБЛИЦА`.* ,year(`ТАБЛИЦА`.date_end) as year, ,month(`ТАБЛИЦА`.date_end)  as month
                       FROM `ТАБЛИЦА` 
                       ORDER BY date_end";

$last_year = false;
$last_month = false;

$result = mysql_query($query) or die('error');
while( $row = mysql_fetch_assoc($result) ) 
{
    // закрываем предыдущую секцию - открываем новую - Year
    if($row['year']!=$last_year){
        if(!!$last_year){
            echo '</ul></ul>';
            $last_month=false; // month-секцию тоже закрываем
        } 
        echo '<ul>' . $row['date_year'] . '(' . $row['count_y'] . ')';
    }
    elseif ($row['month']!=$last_month){
    // закрываем предыдущую секцию - открываем новую - Month
        if(!!$last_month) echo '</ul>';
        echo '<ul><li>' . dateFormatM($row2['date_mes']) . '(' . $row2['count_id'] . ')</li>';
    };
    
    echo '<li><a href="/b' . $row['id'] . '">' . $row['name'] . '</a></li>';
    $last_year=$row['year'];
    $last_month=$row['month'];
}
if(!!$last_year){
    echo '</ul></ul>';
}



Добавлено через 1 минуту и 38 секунд
Насчет полей в запросе и собственно запроса - нужно бы провеить...




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.