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

Поиск:

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


Бывалый
*


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

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



На сервере MySQL жрёт 99% CPU. Как мне оптимизировать скрипты, чтобы меньше жрала, какие есть способы.
PM MAIL WWW MSN   Вверх
MoLeX
Дата 21.5.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



m1kle, запросы в студию


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
m1kle
Дата 21.5.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



MoLeX, Их куча. В основном в программах, которые выполняются каждую минуту автоматически.

Например: $q_zav=mysql_query("select * from `zavodi`");
$zav=mysql_num_rows($q_zav);

или

$sel_p1_precomp=mysql_query("select * from `inv` WHERE `stat`='1' and `name`='$p1[4]'");
$p1_precomp=mysql_fetch_array($sel_p1_precomp);
PM MAIL WWW MSN   Вверх
MoLeX
Дата 21.5.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



тогда может кешировать результат?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
m1kle
Дата 21.5.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



MoLeX, а как это? Это сильно уменьшит CPU?
PM MAIL WWW MSN   Вверх
MoLeX
Дата 21.5.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



все зависит от того сколько данных в БД. но в основном да...


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
skyboy
Дата 21.5.2008, 16:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



может, начать поиск узкого места?
или, изучив логи долгих запросов, определил, что узкое место - конкретные запросы? тогда надо колупать конкретные запросы.
оптимизация всего - штука не только бессмысленная, но и вредная. можно наоптимизировать, что станет только хуже.
Цитата(m1kle @  21.5.2008,  13:44 Найти цитируемый пост)
На сервере MySQL жрёт 99% CPU.

т.е. на сервере - только MySQL крутится? ни apache, ни РНР?
PM MAIL   Вверх
m1kle
Дата 21.5.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



skyboy, есть Apache и PHP.

Информации около 50 Мб.

Просто мне сказали, что стоит оптимизировать код, но я не знаю, как это сделать.

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


Новичок
****


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

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



m1kle, делается это просто.
Сначала надо узнать, какой запрос оптимизировать.  Внимательно читаем предыдущее предложение. оно в этом топике самое важное. Как и во всех вопросах по оптимизации. Оптимизировать надо не запросы вообще, а те, которые реально тормозят.

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

После того, как нашел самые тормозящие - пытаешься понять их неоптимальность или исправить. Если не можешь самостоятельно - приходишь с этими запросами сюда.

Цитата(m1kle @  21.5.2008,  15:05 Найти цитируемый пост)
Например: $q_zav=mysql_query("select * from `zavodi`");
$zav=mysql_num_rows($q_zav);

Это можно оптимизировать и без замеров. Оторвав предварительно руки.
$q_zav=mysql_query("select count(*) from `zavodi`");

PM   Вверх
skyboy
Дата 21.5.2008, 17:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



(продолжая тему избирательной оптимизации)....да и вообще не в БД может быть дело. сокеты с большим timeout по дохлым адресам, вызовы сомнительной надежности программ через system.... да, мало ли ещё чего!
вобщем, первая задача - найти узкое место.
потом уже разберемся, как оптимирзировать.
PM MAIL   Вверх
m1kle
Дата 22.5.2008, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Попробую..
PM MAIL WWW MSN   Вверх
m1kle
Дата 23.5.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Попробовал
$q_zav=mysql_query("select count(*) from `zavodi`");

Он почему считает только одну надпись. А работать стал действительно быстрее на 1 секунду.
PM MAIL WWW MSN   Вверх
Fortop
Дата 23.5.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



m1kle
Слово профайлинг тебе что-то говорит?
Если нет, то прочитай эту заметку http://habrahabr.ru/blog/php/37834.html

И попробуй сделать то, что там описано. Будут вопросы - задавай.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 23.5.2008, 23:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(m1kle @  23.5.2008,  17:43 Найти цитируемый пост)
Он почему считает только одну надпись.

он и должен.
ты дал код, по которому следует, что выборка всех записей таблицы
Цитата(m1kle @  21.5.2008,  14:05 Найти цитируемый пост)
$q_zav=mysql_query("select * from `zavodi`");

делается только для того, чтоб получить количество записей
Цитата(m1kle @  21.5.2008,  14:05 Найти цитируемый пост)
$zav=mysql_num_rows($q_zav);

вот тебе Feldmarschall и привел пример оптимизации: переделал запрос так, чтоб запрос сразу возвращал только количество(одна запись), а не все подряд, только для подсчета.
если тебе надо не только количество, но и данные, то, естественно, такая оптимизация не подходит. но, черт возьми, только ты знаешь, что тебе точно надо. соотвественно, оптимизация - на твоих плечах.
P.S. Ну, как? Провел поиск узкого места? или просто на глаз определил, что "так работает быстрее"?
PM MAIL   Вверх
m1kle
Дата 25.5.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



skyboy, Потихоньку разбираюсь. Мне данные не нужны, только количество. Что-то я непонимаю.
Код

$q_zav=mysql_query("select * from `zavodi`");
$zav=mysql_num_rows($q_zav);
 - это старая запись, она очень тормозит, и как я понял делает ненужную работу.
Код

$q_zav=mysql_query("select count(*) from `zavodi`");
$zav=mysql_num_rows($q_zav);
 - тут проблема в том, что не выводит сколько записей в таблице. ( выводит "1" при echo $zav; )


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

Ещё есть вопрос про оптимизацию.

Правда-ли, что 

"
*Селект из базы один
*Селект из базы два
*Селект из базы один"

Будет больше тормозить, чем
"
*Селект из базы один
*Селект из базы один
*Селект из базы два
"

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


 




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


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

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