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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация Mysql срикптов 
:(
    Опции темы
Feldmarschall
Дата 25.5.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Слушай, если ты не можешь получить строку из БД, то тебе не оптимизацией надо заниматься, а учиться с БД работать. 
http://www.intuit.ru/department/database/mysql/12/ - учебный курс. Освой хотя бы азы. Чтобы такие вопросы тебя не ставили в тупик.

Цитата(m1kle @  25.5.2008,  21:03 Найти цитируемый пост)
Ещё есть вопрос про оптимизацию.


Это вопрос не про оптимизацию. 
Ещё раз, если ты не понял:
Оптимизировать надо то, что тормозит. А не то, про что кто-то где-то сказал.
PM   Вверх
Fortop
Дата 25.5.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(m1kle @  25.5.2008,  21:03 Найти цитируемый пост)
- тут проблема в том, что не выводит сколько записей в таблице. ( выводит "1" при echo $zav; 

А если отойти в сторону от функции PHP mysql_num_rows()
и почитать что тебе возвращает SQL функция COUNT()?

не хочешь попробовать?
Цитата(m1kle @  25.5.2008,  21:03 Найти цитируемый пост)
Fortop, профайлинг ничего не говорит, обязательно прочитаю статью.
Ещё есть вопрос про оптимизацию.

Без понимания что такое профайлинг и для чего он - оптимизировать бесполезно.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
m1kle
Дата 7.6.2008, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

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



Fortop, что такое профайлинг я кажется понял, но как его использовать нет. Пороюсь в интернете.

И ещё, там же про PHP код говорится.

Про count тоже поищу в интернете.

Это сообщение отредактировал(а) m1kle - 7.6.2008, 01:00
PM MAIL WWW MSN   Вверх
Fortop
Дата 7.6.2008, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



m1kle
xdebug.org,
плюс на Хабре были заметки про то, как проводить профайлинг.

Собственно ничего сложного. Ставишь xdebug, настраиваешь его.

Затем запускаешь скрипт на выполнение. Служебная информация пишется в указанную тобой директорию.

Просмотреть ее можно через WinCacheGrind.

Выхватываешь самые медленные куски кода и начинаешь разбирать уже их. Если это SQL запросы, то копируешь их и делаешь в MySQL
EXPLAIN для каждого из запросов.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
m1kle
Дата 7.6.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

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



Разбираюсь, там не так то просто установить, на UNIX.
PM MAIL WWW MSN   Вверх
m1kle
Дата 9.6.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

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



Xdebug очень сложно скомпилировать.
Какое приложение отвечает за команду phpize? А то у меня она пишет, что команда не найдена.

Сорри за даблпостинг - не заметил.

P.S.: Функцией count(*) я пользоваться научился.

И ещё, я тут задумался о Xdebug'e, а нужен ли он вообще, время выполнения можно посмотреть и в HeidiSQL. Другое дело, как именно оптимизировать.

Это сообщение отредактировал(а) m1kle - 9.6.2008, 17:55
PM MAIL WWW MSN   Вверх
Feldmarschall
Дата 9.6.2008, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



для первичного профайлинга достаточно функции microtime()
PM   Вверх
IZ@TOP
Дата 9.6.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 4
Всего: 73



m1kle, если у тебя фря, идешь в порты (если PHP собран из портов) 

Код

cd /usr/ports/devel/php-xdebug/
make install


Потом тебе предложат подключить сошку в конфиг как zend_extension. Подключаешь. Дальше настраиваешь конфиг по ману и радуешься жизни.

А еще есть такая фича как EXPLAIN запросов в MySQL. Проверь все свои запросы, используют ли они индексы и т.п.
Подробнее...
А еще лучше, как кто-то тут сказал, попробовать для начала основы программирования и баз данных выучить. И, заодно, как пользоваться интернетом (в т.ч. http://google.com).

P.S. Ребят, я плакал с этой темы)


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
m1kle
Дата 10.6.2008, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

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



Feldmarschall, Вот в чём проблема я непонимаю, как оптимизировать, мне почему-то всегда кажется, что всё и так по максимальному оптимизировано.


IZ@TOP, cd /usr/ports/devel/php-xdebug/ - такой папки у меня нету.


Код

$q = mysql_query("select * from `work`");
$wk = mysql_fetch_array($q);
$wrk = mysql_num_rows($q);
mysql_query("DELETE from `work` WHERE `time` < 0");
if($wrk!=0)
{
    mysql_query("UPDATE `work` SET `time` = `time` -1");
    $quarre = mysql_query("select * from `work` where `time` = '0'");

    while($work = mysql_fetch_array($quarre))
    {
        $qu = mysql_query("select * from `zavodi` where `id` = '$work[1]'");
        $z = mysql_fetch_array($qu);

        $us1 = mysql_query("select * from `users` WHERE `personaName` = '$work[2]'");
        $row1 = mysql_fetch_array($us1);

        mysql_query("UPDATE `users` SET `money` = `money` + '$z[4]' WHERE personaname = '$work[2]'");
        mysql_query("UPDATE `zavodi` SET `nm` = `nm` + 1 where `id` = '$work[1]'");
        mysql_query("UPDATE `zavodi` SET `balans_m` = `balans_m` - '$z[4]' where `id` = '$work[1]'");
        mysql_query("UPDATE `users` SET `pr` = '$work[1]' WHERE `personaname` = '$work[2]'");
        mysql_query("UPDATE `users` SET `z` = `z` + $z[4] WHERE `personaname` = '$work[2]'");
        mysql_query("UPDATE `ot` SET `rab` = `rab` + 1 WHERE `id` = '1'");
        mysql_query("UPDATE `users` SET `rh` = `rh` + 1 WHERE `personaname` = '$work[2]'");
        $f = rand(1,2);
        if($f==1){ mysql_query("UPDATE users SET `dob` = `dob` + 1 WHERE personaName = '$work[2]'");}
        else{}
        $a = 10 + $row1[13]; $b = rand(1,2);

        if($b == 1) $c = "+" ;
        if($b == 2) $c = "-" ;

        $d = rand(0,3);
        $e = "$a $c $d";

        mysql_query("UPDATE `zavodi` SET `all_res` = `all_res` - $e WHERE id = '$work[1]'");
        mysql_query("UPDATE zavodi SET res = res + $e  where id = '$work[1]'");

        $ball=array("15", "50", "80", "150", "240", "350", "470", "680", "900", "1200", "1500"); $i=0;
        while($i<10){
            if($row1[12] > $ball[$i]){ $i++;}
            else{mysql_query("UPDATE `users` SET `d` = $i WHERE `personaName` = '$work[2]'") or  die(mysql_error()); $i=11;}
        } $i=0;

        $ball=array("10", "20", "50", "80", "170", "300", "450", "600", "850", "1100", "1700", "2200", "2800", "3500");
        while($i<13){
        if($row1[34] > $ball[$i]){ $i++;}
        else{mysql_query("UPDATE `users` SET `um` = $i WHERE `personaName` = '$work[2]'") or  die(mysql_error()); $i=14;}
        }

        mysql_query("UPDATE `company` SET `rayting` = `rayting` + '1' WHERE `name` = '$z[1]'");
        mysql_query("UPDATE `zavodi` SET `rayting` = `rayting` + '1' WHERE `id` = '$z[0]'");
        mysql_query("DELETE FROM `work` WHERE `pers` = '$work[2]'") or  die(mysql_error()) ;
    }
}


 Вот например код, ну что тут можно оптимизировать?
PM MAIL WWW MSN   Вверх
IZ@TOP
Дата 10.6.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 4
Всего: 73



Feldmarschall, +1.


m1kle, а я и не говорил что она у тебя должна быть. Я ведь не знаю какая у тебя система, просто для примера привел.
А вот что оптимизировать в этом коде, это ты должен сам определить. 
Хотя бы запросы протестируй как я говорил:

Код

EXPLAIN твой-SELECT-запрос



Это сообщение отредактировал(а) IZ@TOP - 10.6.2008, 15:55


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Feldmarschall
Дата 10.6.2008, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



IZ@TOP, тут апдейты в цикле. И не в цикле. И по одному, и пачками. И вся база перетряхивается. 
Этот тот случай, когда эксплейн не поможет - здесь руки надо выпрямлять и мозги вправлять, а не отдельные запросы тестировать.
Тут только моя рекомендация поможет, которую добрый модератор удалил. Потому что тишина должна быть в библиотеке.

Добавлено через 3 минуты и 46 секунд
меня другое радует:
Цитата(m1kle @  9.6.2008,  16:55 Найти цитируемый пост)
Функцией count(*) я пользоваться научился.

Цитата(m1kle @  10.6.2008,  03:10 Найти цитируемый пост)
$q = mysql_query("select * from `work`");
$wk = mysql_fetch_array($q);
$wrk = mysql_num_rows($q);


Добавлено через 5 минут и 7 секунд
m1kle, как часто выполняется этот скрипт?
каков размер таблицы zavodi и других, перечисленных в этом скрипте?
PM   Вверх
m1kle
Дата 11.6.2008, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

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



IZ@TOP, тут апдейты в цикле. И не в цикле. И по одному, и пачками. И вся база перетряхивается. 

Так получается, это замысл работы скрипта.
Про count(*) в такой маленькой БД count ничего не даст.

Work 4 Кб
Zavodi 12,4 Кб
Users 295 Кб

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

Как считает, можно что нибудь сдесь улучшить?
PM MAIL WWW MSN   Вверх
Feldmarschall
Дата 11.6.2008, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Цитата(m1kle @  11.6.2008,  03:30 Найти цитируемый пост)
Work 4 Кб
Zavodi 12,4 Кб
Users 295 Кб

какие интересные таблицы. а где же остальные 50 мегабайт лежат?
Цитата(m1kle @  11.6.2008,  03:30 Найти цитируемый пост)
Так получается, это замысл работы скрипта.

Вот об том и речь, что замысел и надо переделывать. Замысел. Заплатками тут не обойдешься.
Не нужно раз в минуту ничего апдейтить. БД не для этого предназначена. 
все данные можно вычислить по надобности. пришел игрок через час - посчитал его параметры - и записал в базу. один раз за час. а не 60.
Это азы. основы. И у тебя они не выполняются. И оптимизировать этот винегрет из апдейтов - бесполезно.



PM   Вверх
Feldmarschall
Дата 11.6.2008, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Цитата(m1kle @  10.6.2008,  03:10 Найти цитируемый пост)
        mysql_query("UPDATE `users` SET `money` = `money` + '$z[4]' WHERE personaname = '$work[2]'");
        mysql_query("UPDATE `zavodi` SET `nm` = `nm` + 1 where `id` = '$work[1]'");
        mysql_query("UPDATE `zavodi` SET `balans_m` = `balans_m` - '$z[4]' where `id` = '$work[1]'");
        mysql_query("UPDATE `users` SET `pr` = '$work[1]' WHERE `personaname` = '$work[2]'");
        mysql_query("UPDATE `users` SET `z` = `z` + $z[4] WHERE `personaname` = '$work[2]'");
        mysql_query("UPDATE `ot` SET `rab` = `rab` + 1 WHERE `id` = '1'");
        mysql_query("UPDATE `users` SET `rh` = `rh` + 1 WHERE `personaname` = '$work[2]'");
        $f = rand(1,2);
        if($f==1){ mysql_query("UPDATE users SET `dob` = `dob` + 1 WHERE personaName = '$work[2]'");}

ну ХОТЯ БЫ сократить эту колбасу до трех запросов можно было догадаться?

и сколько у тебя таких скриптов, которые раз в минуту выполняются?
и сколько вообще запросов приходится на скрипт?
PM   Вверх
m1kle
Дата 11.6.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 2.5.2007
Где: Москва, Россия

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



50 мегабайт, в другой таблице, в которая не участвуете в предоставленным мною скрипту.

"Вот об том и речь, что замысел и надо переделывать. Замысел. Заплатками тут не обойдешься.
Не нужно раз в минуту ничего апдейтить. БД не для этого предназначена. 
все данные можно вычислить по надобности. пришел игрок через час - посчитал его параметры - и записал в базу. один раз за час. а не 60.
Это азы. основы. И у тебя они не выполняются. И оптимизировать этот винегрет из апдейтов - бесполезно."

В онлайн играх есть такая штука, как работа, там нужно каждую минуту проверять, не закончил ли кто-то работать, это необходимо.

"ну ХОТЯ БЫ сократить эту колбасу до трех запросов можно было догадаться?"

Разве можно делать сразу несколько запросов к таблице одним Апдейтом?

"и сколько у тебя таких скриптов, которые раз в минуту выполняются?"

Есть ещё один, огромный, двести строк.

Остальные раз в час, раз в день.
PM MAIL WWW MSN   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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