SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.09.2012 10:18:33

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Превышение нагрузки по MySQL на хостинге

Всех приветствую!
Хостинг уже достал предупреждениями о нагрузке, перевелись на более "продвинутый" тарифный план, но нагрузка все равно выше дозволенного. Необходимо каждый день загружать/обновлять в одной таблице 200 000 строк, раньше были короткие транзакции по 100 строк, с промежутком 2 секунды. Сейчас сделал загрузку через LOAD DATA LOCAL INFILE файлами по 10 000 строк в каждом файле, но опять же нагрузка не особо уменьшилась. Ниже приведу инфу как расчитывается нагрузка на сервере и саму загрузку.

"Мы используем стандартный механизм для статистики процессов, а именно вывод команды sa, подробную информацию Вы можете найти по ссылке http://linux.die.net/man/8/sa.
Каждый процесс, запущенный от имени Вашего пользователя создаёт нагрузку на процессор, это нагрузка измеряется в процессорных минутах и суммируется в течение дня. Это и есть результат, который выводится в пользовательскую панель, то есть cp.
Также считается нагрузка на MySQL - измеряется количество процессорных минут на обработку запроса к базе данных от имени Вашего пользователя."

Таблица innodb:

CREATE TABLE `nomenklatura` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(50) NOT NULL,
  `sklad` varchar(50) NOT NULL,
  `article` varchar(50) NOT NULL,
  `name` varchar(1000) NOT NULL,
  `original` varchar(2000) NOT NULL,
  `manufacturer` varchar(50) NOT NULL,
  `cen_grup` varchar(50) NOT NULL,
  `srok_sklad` tinyint(4) NOT NULL,
  `nal_sklad` smallint(6) NOT NULL,
  `big` tinyint(4) NOT NULL,
  `price` double NOT NULL,
  `val` varchar(3) NOT NULL,
  `ed` varchar(8) NOT NULL DEFAULT 'шт',
  `opisanie` varchar(1000) NOT NULL,
  `img` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`,`sklad`),
  KEY `article` (`article`,`manufacturer`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

CREATE TEMPORARY TABLE temptab (uid varchar(50), sklad varchar(50), article varchar(50), name varchar(1000), original varchar(2000), manufacturer varchar(50), cen_grup varchar(50), srok_sklad tinyint(4), nal_sklad smallint(6), big tinyint(4), price double, val varchar(3), ed varchar(8))

LOAD DATA LOCAL INFILE "/home/public_html/load/1.txt" INTO TABLE temptab

INSERT INTO nomenklatura (uid, sklad, article, name, original, manufacturer, cen_grup, srok_sklad, nal_sklad, big, price, val, ed) SELECT temptab.uid, temptab.sklad, temptab.article, temptab.name, temptab.original, temptab.manufacturer, temptab.cen_grup, temptab.srok_sklad, temptab.nal_sklad, temptab.big, temptab.price, temptab.val, temptab.ed FROM temptab ON DUPLICATE KEY UPDATE nomenklatura.article=temptab.article, nomenklatura.name=temptab.name, nomenklatura.original=temptab.original, nomenklatura.manufacturer=temptab.manufacturer, nomenklatura.srok_sklad=temptab.srok_sklad, nomenklatura.nal_sklad=temptab.nal_sklad, nomenklatura.big=temptab.big, nomenklatura.price=temptab.price, nomenklatura.ed=temptab.ed

DROP TABLE temptab

Неактивен

 

#2 26.09.2012 10:28:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Превышение нагрузки по MySQL на хостинге

Превышение процессорной квоты - сопутствующий атрибут виртуального хостинга. Посмотрите на графики нагрузки, которые направляет хостер - если превышение в среднем по дню, то исправить ничего нельзя, нужно переходить на VDS, а если превышение только раз в сутки, то странно, что хостера это беспокоит. Можно, например, разбить вставку и вставлять по 2000 строк с интервалом минута.

Неактивен

 

#3 26.09.2012 11:09:46

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Превышение нагрузки по MySQL на хостинге

Нам предлагают взять VPS-сервер на том же хостинге, как Вы думаете оправдано ли это или все таки думать насчет VDS?

Неактивен

 

#4 26.09.2012 11:12:25

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Превышение нагрузки по MySQL на хостинге

VPS и VDS это в нулевом приближении одно и то же, должен подойти.

Неактивен

 

#5 26.09.2012 13:32:58

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Превышение нагрузки по MySQL на хостинге

Может такая нагрузка идет из-за обилия индексов? Хотя вроде бы при заливке через LOAD DATA INFILE индексы не учитываются.

Неактивен

 

#6 26.09.2012 14:50:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Превышение нагрузки по MySQL на хостинге

Индексы при LOAD DATA INFILE создаются, но достаточно эффективным алгоритмом. Снижение количества индексов снизит нагрузку, но принципиальной проблемы не решит. У вас всего три индекса, судя по приведенной структуре.

Неактивен

 

#7 26.09.2012 15:26:03

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Превышение нагрузки по MySQL на хостинге

Так, ну вроде проблема стала более понятной, в течении дня даже без загрузки этих 200к строк нагрузка доходит до пиковой. Значит скорее всего грузят сами юзвери.

Неактивен

 

#8 26.09.2012 15:56:04

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Превышение нагрузки по MySQL на хостинге

На сайте с высокой частотой выполняется запрос вида:

SELECT user_uid FROM rcsessions WHERE ((ip='$ip' AND browser='$browser') OR remember=1) AND session='$cookie' LIMIT 1

По каким полям лучше создать простой INDEX?

Неактивен

 

#9 26.09.2012 16:11:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Превышение нагрузки по MySQL на хостинге

Индекс по session должен помочь, так как это обычно выберет одну строку

Неактивен

 

#10 26.09.2012 16:25:34

septera
Завсегдатай
Откуда: Краснодар
Зарегистрирован: 16.02.2011
Сообщений: 30

Re: Превышение нагрузки по MySQL на хостинге

rgbeast, огромное спасибо, а то с индексами у меня проблемы smile
И последнее, для данного запроса как лучше построить индекс?

SELECT rcorder.order_id, rcorder.date, rcorder.sp_opl, rcorder.sp_dost, rcorder.comment, vlozh.sum FROM rcorder LEFT JOIN (SELECT rcallorders.user_uid AS user_uid, rcallorders.order_id AS order_id, SUM(rcallorders.kolvo * ROUND(rcallorders.price + 0.001 - rcallorders.price/100*rcallorders.discount)) AS sum FROM rcallorders GROUP BY rcallorders.order_id, rcallorders.user_uid) AS vlozh USING(user_uid,order_id) WHERE user_uid='$user_uid' AND rcorder.status=1 ORDER BY rcorder.order_id DESC

Неактивен

 

#11 26.09.2012 16:52:57

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Превышение нагрузки по MySQL на хостинге

На rcorder индекс (user_uid,status), на rcallorders на (user_uid, order_id).

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson