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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Классы и скорость

Сообщения:  [1-10]   [11-11] 

 
 автор: cheops   (12.09.2006 в 11:26)   письмо автору
 
   для: Skyonex_   (12.09.2006 в 03:20)
 

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

   
 
 автор: Skyonex_   (12.09.2006 в 03:20)   письмо автору
 
   для: cheops   (12.09.2006 в 01:15)
 

168 Mb. Может я зря храню историю сообщений в таком виде? Все что можно разбить, это выделить отдельную таблицу под поле message это таблицы.

   
 
 автор: cheops   (12.09.2006 в 01:15)   письмо автору
 
   для: Skyonex_   (11.09.2006 в 22:40)
 

Какой объём в мегабайах занимает таблица? Все данные активны? Нет ли возможности разбить таблицу на несколько более мелких - тогда операции добавления, да и поиска проходили бы быстрее.

   
 
 автор: Trianon   (12.09.2006 в 00:07)   письмо автору
 
   для: Skyonex_   (11.09.2006 в 01:23)
 

Уберите свойство online из таблицы.
Заведите отдельную таблицу online-пользователей.

   
 
 автор: Skyonex_   (11.09.2006 в 22:40)   письмо автору
 
   для: cheops   (11.09.2006 в 12:23)
 

Да. Таблицы индексированы.

Вопрос такой. Есть таблица messages

id (primary int)
to_id int
from_id int
message varchar(255)
readflag tinyint(1)

Запрос такой на вставку:


<?
$query
="insert intomessages(from_id,to_id,message,postdate,readflag) values($fromid,$toid,'$message','$postdate',0)";
?>


Индексы по полям from_id и to_id

Запрос на чтение:


<?
$query
="select from_id,message,postdate,readflag from messages where (from_id=$fromid and to_id=$this->userid) or (to_id=$fromid and from_id=$this->userid) order by id DESC LIMIT $start,$perpage";

//установка флага о прочтении
$query="update messages set readflag=1 where from_id=$fromid and to_id=$this->userid";
?>


В умной и толстой книге написано, что если производятся часто запросы на чтение, обязательно используйте индексы, это понятно. Если же в таблице идет активное добавление и/или обновление, тогда от индексов лучше отказаться... У меня по таблице и то и другое мягко говоря весьма активно... Как же быть? Если я откажусь от индексов в таблице с 1500000 записей и ростом это числа... у меня все помрет. И так мрет.

   
 
 автор: programmer_2006   (11.09.2006 в 19:32)   письмо автору
 
   для: Skyonex_   (07.09.2006 в 04:03)
 

Классы даже в пхп 5 сильно снижают производительность. Если для тебя это важно откажись от них либо используй по минимумму.
1)Постарайся уменьшить количество обращений к базе, когда обращаешся попытайся взять по максимуму.Пиши в некоторых случаях сложные запросы.
2) Оптимизация таблиц, написано много толстых книг. это то же очень важно.
3) Ну сами запросы это уже тонкости.
4)К сожелению модель доступа к данным очено слаба это тебе не ADO.Net

   
 
 автор: cheops   (11.09.2006 в 12:23)   письмо автору
 
   для: Skyonex_   (11.09.2006 в 01:23)
 

Объём таблиц какой примерно? Таблицы индексированы?

   
 
 автор: PIXEL   (11.09.2006 в 01:40)   письмо автору
 
   для: Skyonex_   (11.09.2006 в 01:23)
 

скорость выполнения классов в пхп 4.х.х сравнима со скоростью выполнения пхп с помощью eval();

но все же кажется, надо искать проблему в другом:
убирать излишнюю абстракцию и оптимизировать запросы к бд

   
 
 автор: Skyonex_   (11.09.2006 в 01:23)   письмо автору
 
   для: cheops   (07.09.2006 в 12:57)
 

Снижение скорости катастрофическое ((( С 0.0712 с. до 1.5087 с. и выше... Могу улучшить конечно код, но обращений к базе меньше намного не станет. А это видимо вери бэд как оказалось.

Сайт знакомств. Онлайн ВСЕГО ЛИШЬ до 260 человек. К базе идут такие обращения как:
- Кол-во онлайн (ВСЕГО, ПАРНЕЙ, ДЕВУШЕК)


<?
$query
="select count(*) from users where sex='M' and online=1";

//или

$query="select count(*) from users where online=1";
?>


(остановился приблизительно на такой же логике как с этого сайта в разделе "Примеры скриптов")

при открытии каждой страницы сайта проверяется авторизация по сессия и если да, обновляется в таблице online_users время:


<?
if(isset($_SESSION['uid'])&&($_SESSION['isAuth']==1))
{
                  
$sid=session_id();

                  
$query="update online_users set session_expire=NOW() where session_key='$sid'";
                  
$this->mydb->Query($query);

            return 
1;
}
?>


- Обновление статуса онлайн пользователя при входе
- Проверка на новые сообщения добавление/Чтение сообщений (о них я писал уже пару раз на этом форуме)


<?
//Проверка на существование id пользователя кому шлем сообщение
$query="select count(id) from users where id=$toid";
          
$this->mydb->Query($query);

          if(
$this->mydb->GetSqlResult(0)==0)
          {
                  return 
0;
          }

//Добавление сообщения
$query="insert into messages(from_id,to_id,message,postdate,readflag) 
values(
$fromid,$toid,'$message','$postdate',0)";
?>


- Поиск пользователей по различным критериям.
- Просмотр анкет.
- Уборка мусора каждые 10 минут (чистка таблицы online_users)


<?
        
////////////////////////////////////////////////////////////////
        //Уборка мусора/////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////
        
function GC()
        {
            
$query="select user_id from online_users where session_expire<NOW() - INTERVAL '15' MINUTE";
            
$this->mydb->Query($query);

            while(
$row=$this->mydb->FetchArray()) $temp[] = $row[0];

            if(!empty(
$temp))
            {
                
$query "update users set lastvisit=NOW(),online=0 where id IN (".implode(",",$temp).")";
                
$this->mydb->Query($query);
            }

            
$query="delete from online_users where session_expire<NOW() - INTERVAL '15' MINUTE";
            
$this->mydb->Query($query);

            return 
true;
        }
?>


и т.д. и т.п.

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

Если можете что-то предложить по облегчению, буду очень признателен.

   
 
 автор: cheops   (07.09.2006 в 12:57)   письмо автору
 
   для: Skyonex_   (07.09.2006 в 04:03)
 

У вас наблюдается заметное снижение скорости? Что ещё вы испльзуете? Может базу данных? Проблема замедления может быть связана и не с классами, опишите подробнее ваш сайт? Многого ли на нём информации?

   

Сообщения:  [1-10]   [11-11] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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