оптимизация mysql

12
AX
На сайте с 15.06.2004
Offline
164
679

Друзья, нужна помощь.

я профан в mySql и че-то у меня сайт валит на хостинге mysql. создавая дикую нагрузку. программер который изначально мне это писал давно пропал без вести.

после анализа логов нашел у него в скрипте такие строки:


$query = 'UPDATE `table1` SET `cod`='.$data->city->id.' WHERE `cod` ='.$id;
$result = mysql_unbuffered_query ($query);
$query = 'UPDATE `table2` SET `id`='.$data->city->id.' WHERE `id` ='.$id;
$result = mysql_unbuffered_query ($query);
$query = 'DELETE FROM `table3` WHERE `city_id` = '.$id;
$result = mysql_unbuffered_query ($query);
$query = 'DELETE FROM `table4` WHERE `city_id` = '.$id;
$result = mysql_unbuffered_query ($query);

или такие:


// удаляем старое....
$query = 'DELETE FROM `table1` WHERE `city_id` = '.$data->city->id;
$result = mysql_unbuffered_query ($query);
// добавляем новое....
$query = "INSERT INTO `table1` (`city_id`, `date`, `text`)
VALUES (
'".$data->city->id."',
'".$dt_f."',
'".$txt."'
)
";

$result = mysql_unbuffered_query ($query);

и вот я хоть и чайник, а понимаю что тут явно избыток обращений к БД. но как я ни пытался сам тут поправить к 1 запрос, оно что- то не получается.

подскажите как то это можно в 1 запрос записать, а то в коде полно таких мест, судя по логам эти места и создают нагрузку.

спасибо. извините если вопрос был уж сильно глупый.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#1

У вас сервер? Виратуальный хостинг? VPS? Что у вас?

---------- Добавлено 30.07.2013 в 16:55 ----------

На каком движке сайт?

Какие характеристики сервера?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
C
На сайте с 04.02.2005
Offline
291
#2

м... а что тут оптимизировать?

Разве что анализ рантайм кода, на необходимость таких апдейтов, делитов и инсертов.

AX
На сайте с 15.06.2004
Offline
164
#3

LEOnidUKG, хостинг виртуальный.

движка как такового нет, сайт писался с нуля в 2004-2005 году.

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

Chukcha, во втором случае мне кажется точно можно вместо delete и потом инсерта сделать update. или нет? или это роли не сыграет?

их там таких обращений тьма и таблица сама по себе большая.

а в первом случае если записать все в 1 запрос, а потом уже сделать mysql_unbuffered_query ($query); легче не станет.

C
На сайте с 04.02.2005
Offline
291
#4

Согласен, во втором случае, возможно.

AX
На сайте с 15.06.2004
Offline
164
#5
Chukcha:
Согласен, во втором случае, возможно.

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

DP
На сайте с 24.04.2012
Offline
16
#6

Update `table1` SET `date`='".$dt_f."', `text`='".$txt."' WHERE `city_id`='".$data->city->id."'
C
На сайте с 04.02.2005
Offline
291
#7

UPDATE `table1`

SET `date`='. ,$dt_f.'

`text`='.$txt.'

WHERE `cod` ='.$data->city->id;

но тут возможны варианты

Возможно нужны еще дефолтные значения.

AX
На сайте с 15.06.2004
Offline
164
#8

спасибо. попробую сейчас.

Glueon
На сайте с 26.07.2013
Offline
172
#9

DELETE оператор по-моему позволяет делать INNER JOIN, удаляя таким образом сразу из нескольки таблиц одновременно.

Но если у вас InnoDB я бы транзакции сделал ...

И DELETE + INSERT заменить на UPDATE, а то это по-моему совсем трэш :) Разве что у вас там может до удаления быть несколько записей с city_id, их нужно удалить все и вставить одну новую.

Есть много IP-сетей в аренду под прокси, парсинг, рассылки (optin), vpn и хостинг. Телега: @contactroot ⚒ ContactRoot команда опытных сисадминов (/ru/forum/861038), свой LIR: сдаем в аренду сети IPv4/v6 (/ru/forum/1012475).
siv1987
На сайте с 02.04.2009
Offline
427
#10
AALLXX:
$query = 'UPDATE `table1` SET `cod`='.$data->city->id.' WHERE `cod` ='.$id;
$result = mysql_unbuffered_query ($query);
$query = 'UPDATE `table2` SET `id`='.$data->city->id.' WHERE `id` ='.$id;
$result = mysql_unbuffered_query ($query);
$query = 'DELETE FROM `table3` WHERE `city_id` = '.$id;
$result = mysql_unbuffered_query ($query);
$query = 'DELETE FROM `table4` WHERE `city_id` = '.$id;
$result = mysql_unbuffered_query ($query);

Здесь ничего тяжелого нету, обычные запросы которые могут и без индексов выполнятся. Конечно, если там не многомиллионная таблица и запросы не запускаются в цикле по 10К итерации.

AALLXX:
и вот я хоть и чайник, а понимаю что тут явно избыток обращений к БД.

4-5 запросов?

AALLXX:
их там таких обращений тьма и таблица сама по себе большая.

Структуру покажите, может индексы помогут.

---------- Добавлено 30.07.2013 в 18:06 ----------

AALLXX:
// удаляем старое....
$query = 'DELETE FROM `table1` WHERE `city_id` = '.$data->city->id;
$result = mysql_unbuffered_query ($query);
// добавляем новое....
$query = "INSERT INTO `table1` (`city_id`, `date`, `text`)
VALUES (
'".$data->city->id."',
'".$dt_f."',
'".$txt."'
)
";

$result = mysql_unbuffered_query ($query);

ON DUPLICATE KEY UPDATE поможет если city_id UNIQUE или PRIMERY KEY

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий