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

Поиск:

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


Новичок
****


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

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



НЕСКОЛЬКО ПОЛЕЙ в одной строке можно обновлять ОДНИМ запросом.
если ты в таблице users меняешь поля money, rh, и dob, то это можно, и нужно! делать одним запросом. а не десятью.
ты так и не ответил на вопрос, сколько всего запросов исполняется
PM   Вверх
skyboy
Дата 11.6.2008, 21:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(m1kle @  11.6.2008,  20:14 Найти цитируемый пост)
там нужно каждую минуту проверять

зачем? пришел запрос - проверили. не пришел - ничего не проверяем. или ты думаешь, что автоинкрементный счетчик работы даже без надобности в нем - это круто? smile
PM MAIL   Вверх
Fortop
Дата 11.6.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(m1kle @  11.6.2008,  21:14 Найти цитируемый пост)
В онлайн играх есть такая штука, как работа, там нужно каждую минуту проверять, не закончил ли кто-то работать, это необходимо.

Зачем?

Данные нужно проверять лишь при обращении к ним. Иначе у тебя никакая база не выдержит.


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


Бывалый
*


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

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



Feldmarschall, прочитал я синтаксис оператора UPDATE, стало многое понятно.


skyboy, всегда кто-то работает, всегда нужно уменьшать время сколько осталось работать на еденицу.

Fortop, У мен так и есть, если что-то лежит в базе - делаем, не лежит, не делаем.

Код

$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 `comp`,`zarplata` from `zavodi` where `id` = '$work[1]'");
        $z = mysql_fetch_array($qu);

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

        $f = rand(1,2);
        if($f==1){ mysql_query("UPDATE `users` SET `dob` = `dob` + 1 WHERE `personaName` = '$work[2]'");}

        $a = 10 + $row1[2]; $b = rand(1,2);

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

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

        $ball=array("15", "50", "80", "150", "240", "350", "470", "680", "900", "1200", "1500"); $i=0;
        while($i<10){
            if($row1[0] > $ball[$i]){ $i++;}
            else{mysql_query("UPDATE `users` SET `d` = $i WHERE `personaName` = '$work[2]'") ; $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[3] > $ball[$i]){ $i++;}
        else{mysql_query("UPDATE `users` SET `um` = $i WHERE `personaName` = '$work[2]'"); $i=14;}
        }

        mysql_query("UPDATE `company` SET `rayting` = `rayting` + '1' WHERE `name` = '$z[0]'");
        mysql_query("UPDATE `zavodi` SET `all_res` = `all_res` - $e, `res` = `res` + $e, `rayting` = `rayting` + 1 WHERE id = '$work[1]'");
        mysql_query("DELETE FROM `work` WHERE `pers` = '$work[2]'");
        mysql_query("UPDATE `users` SET `money` = `money` + '$z[1]', `pr` = '$work[1]', `z` = `z` + $z[1], `rh` = `rh` + '1'  WHERE personaname = '$work[2]'");
        mysql_query("UPDATE `zavodi` SET `nm` = `nm` + 1, `balans_m` = `balans_m` - '$z[4]' WHERE `id` = '$work[1]'");

    }
}


Вот новый код. Помоему по сравнению со старым кодом, это просто супер-код. Что то ещё можно сделать?

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


Новичок
****


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

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



ничего.
как тебе уже сто раз сказали - оптимизируют не супер-кодом, а замерами.
ты этого так и не понял. и не поймешь.
PM   Вверх
skyboy
Дата 13.6.2008, 08:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(m1kle @  12.6.2008,  21:55 Найти цитируемый пост)
skyboy, всегда кто-то работает

у тебя реальная работа с лопатой за окном или модель, основанная на БД и алгоритмах? 
положим, мне надо определить время выполнения скрипта. как мне лучше сделать: каждую секунду увеиличать счетчик секунд на 1 или посчитать время до запуска, время после выполнения и вычислить разницу?
PM MAIL   Вверх
Fortop
Дата 13.6.2008, 11:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(m1kle @  12.6.2008,  22:55 Найти цитируемый пост)
Fortop, У мен так и есть, если что-то лежит в базе - делаем, не лежит, не делаем

Тебе skyboy, уже привел пример.
Вопрос не в делаем/не делаем.

Вопрос в том, что ты не должен обновлять данные каждую секунду/минуту. А рассчитывать их когда какой-либо пользователь захочет их прочитать. Рассчитал, и сохранил с новым временем. Теперь при следующем обращении ты будет отсчитывать от текущих значений.

И только 1-2 раза в сутки ты можешь сделать глобальный пересчет. Например для статистики/рейтингов и т.д.

Пример.

Есть иммитатор выращивания морковки. Вместо того чтобы каждую секунду обновлять базу, что какая-то морковка выросла на 1мм.
Мы сохранили ее состояние на момент посева 0мм и время. Также у нас есть формула за сколько времени она вырастает на 1мм.

Тогда, если пользователь посмотрел на эту конкретную морковку.... 
1. Мы читаем состояние из базы, вычисляем разницу между временем текущим и тем что в базе. 
2. Записываем новое состояние (3мм и время в базу).


Все остальное время мы базу не трогаем.


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


Бывалый
*


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

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



Похоже я начинаю въезжать. Только реализовать вычитание из одного времени другое?

Тогда получается штука, которая выполняется раз в минуту не нужна.
PM MAIL WWW MSN   Вверх
Feldmarschall
Дата 18.6.2008, 08:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



Я бы, все-таки, разобрался сначала, что именно у него там тормозит.
удивительно ведь - база крошечная, все в памяти крутится.  Тупо от количества запросов ложится? 
Или аффтар врет, что таблицы только маленькие. Ну что за база юзеров размером в 300 килобайт. что у него - всего пара тыщ человек зарегистрировано, что ли?
или тормозит совсем в другом месте.

Надо смотреть в базе show processlist в момент, когда проц занят
смотреть slow queries log

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


Бывалый
*


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

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



Да, две тысячи сто с небольшим человек.

В этом скрипте уже неважно, где тормозит, его скоро не будет.
PM MAIL WWW MSN   Вверх
Feldmarschall
Дата 18.6.2008, 09:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



хех. действительно. теперь будет тормозить в другом =)
PM   Вверх
IZ@TOP
Дата 18.6.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


Feldmarschall, на счет выпрямления конечностей согласен. И за дурачка, пожалуйста, меня не держи, ок? А вот апдейты - не самое страшное, если на поля в условии созданы индексы. Еще меньше это все роляет, если таблица InnoDB с транзакциями. 

Цитата(m1kle @  11.6.2008,  22:14 Найти цитируемый пост)
Разве можно делать сразу несколько запросов к таблице одним Апдейтом?


Я плачу...


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

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


Новичок
****


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

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



Цитата(IZ@TOP @  18.6.2008,  12:57 Найти цитируемый пост)
А вот апдейты - не самое страшное, если на поля в условии созданы индексы. 

ты хотел сказать - наоборот. если селекты, то не самое страшное, если в полях созданы индексы.
а вот апдейтов, как раз, злейший враг - индексы. поскольку после каждого апдейта надо ВЕСЬ индекс перестроить. что есть операция гораздо более затратная, чем, просто записать новую строчку в таблицу.
PM   Вверх
IZ@TOP
Дата 18.6.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Feldmarschall @  18.6.2008,  14:23 Найти цитируемый пост)
ты хотел сказать - наоборот. если селекты, то не самое страшное, если в полях созданы индексы.
а вот апдейтов, как раз, злейший враг - индексы. поскольку после каждого апдейта надо ВЕСЬ индекс перестроить. что есть операция гораздо более затратная, чем, просто записать новую строчку в таблицу. 

Я как хотел - так и сказал. Давайте не будем путать понятия: апдейт и инсерт. 
А что происходит, когда на таблице MyISAM проходит запрос на UPDATE с условием по полю, на котором нет индекса я видел неоднократно. И результат, самое главное, всегда один: забивается очередь запросов.

По поводу перестройки индексов, читаем оф. документацию:
Цитата

7.2.20. Speed of UPDATE Statements

An update statement is optimized like a SELECT query with the additional overhead of a write. The speed of the write depends on the amount of data being updated and the number of indexes that are updated. Indexes that are not changed do not get updated. 


Это сообщение отредактировал(а) IZ@TOP - 18.6.2008, 14:27


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

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


Бывалый
*


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

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



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


 




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


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

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