powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный insert при большой нагрузке
23 сообщений из 23, страница 1 из 1
Медленный insert при большой нагрузке
    #39717866
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Я в общем-то далеко не спец по mysql/php, но выпала необходимость разработать бэкэнд для проекта с немалой посещаемостью.

Если кратко: есть php-скрипт, в числе функций которого добавление новой записи в таблицу (или же обновления существующей, если запись для данного пользователя уже есть). В боевом режиме функция может дёргаться примерно 50 раз в секунду, при этом скорость добавления записей достигает максимум 5 в секунду, т.е. добавление 7500 записей закончится только через неприличные 25 минут. select-запросы из той же таблицы выполняются за приемлемое время.

Структура таблицы – 4 поля: одно int(11), одно datetime и два varchar длиной 10 и 32, последний из которых primary index (кривоватый момент, но, судя по всему, он бы скорее влиял на скорость выборки). InnoDB.

Пока не могу понять, лежит ли причина в php или mysql-части. Явно что-то не так. Пробовал менять innodb_flush_log_at_trx_commit на 0 и 2, ощутимой разницы не дало. Использование в php постоянных кэшируемых соединений помогло предотвратить перегрузки сервера, имевшие место ранее при подобных нагрузках.

Самый частый ответ на подобный вопрос – объединять insert-запросы в один, но, как было упомянуто ранее, все данные приходят от разных пользователей, и мой нубский мозг не может пока представит, возможно ли вообще объединение инсертов в этой ситуации.

php-код:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
function user_insert($dbh,$upts,$uid,$time,$gid,$uhash)
{
try
	{
		$uuid=str_replace(".".$gid,"",$uid);
		$stmt1 = $dbh->query("SELECT COUNT(*) from `banned` WHERE tb_uid = '$uuid'");
		$result1 = $stmt1->fetchColumn();
		if ($result1 > 0)
			$upts=0;
		if ($upts>0)
		{
			$stmt = $dbh->prepare("INSERT INTO users_table (tb_pts, tb_time, tb_uid, tb_gid) VALUES(:upts, :time, :uid, :gid)
			ON DUPLICATE KEY UPDATE tb_pts = GREATEST(:upts2, tb_pts), tb_time = :time2, tb_gid = :gid2");
			$stmt ->bindparam(':upts', $scdc, PDO::PARAM_STR);
			$stmt ->bindparam(':time', $time, PDO::PARAM_STR);
			$stmt ->bindparam(':uid', $uid, PDO::PARAM_STR);
			$stmt ->bindparam(':gid', $gid, PDO::PARAM_STR);
			$stmt ->bindparam(':upts2', $scdc, PDO::PARAM_STR);
			$stmt ->bindparam(':time2', $time, PDO::PARAM_STR);
			$stmt ->bindparam(':gid2', $gid, PDO::PARAM_STR);

			$stmt->execute();
			echo "1";
		}
		else
			echo "0";
	}
	catch (PDOExecption $ex)
	{
		echo "0";
	}
	//$dbh = null;
}



Буду рад любой помощи.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39717897
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatesting,

это ветка по mysql, а не php, поэтому , если хочешь получать ответ, общайся на уровне mysql,
а не заставляй людей ломать голову
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39717957
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяgpbetatesting,

это ветка по mysql, а не php, поэтому , если хочешь получать ответ, общайся на уровне mysql,
а не заставляй людей ломать голову

Поконкретнее, нужно больше данных про устройство таблицы? Из запроса видно, что он довольно простой, и причина тормозов, вероятно, в том, что запросы "наслаиваются" друг на друга, заставляя последних ждать завершения первых.

Всё-таки создал аналогичную тему в подфоруме по PHP.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718048
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatestingПоконкретнее, нужно больше данных про устройство таблицы?чистый запрос, DDL таблицы
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718065
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадячистый запрос
Код: sql
1.
2.
INSERT INTO users_table (tb_pts, tb_time, tb_uid, tb_gid) VALUES(:upts, :time, :uid, :gid)
	ON DUPLICATE KEY UPDATE tb_pts = GREATEST(:upts, tb_pts), tb_time = :time, tb_gid = :gid




вадяDDL таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS `user_table` (
  `tb_uid` varchar(32) NOT NULL,
  `tb_pts` int(11) NOT NULL,
  `tb_gid` varchar(10) NOT NULL,
  `tb_time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `user_table`
 ADD PRIMARY KEY (`tb_uid`), ADD UNIQUE KEY `hs_uid` (`tb_uid`);
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718071
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatesting,

А зачем уникальный ключ из того же поля, которое является первичным ключом?
Уникальный ключ лучше убрать.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718074
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatesting,

Включите логирование запросов в MySQL, проверьте сколько времени выполняются запросы.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718077
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatesting,

Код: sql
1.
`tb_uid` varchar(32)


???
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718078
machetero
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каноничный случай использования кэша(redis,memcached). Собираете данные в кэше, и потом за раз сливаете в бд.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718081
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
macheteroКаноничный случай использования кэша(redis,memcached). Собираете данные в кэше, и потом за раз сливаете в бд.Простого плоского файла хватило бы :)

Вопрос в том, как быстро нужно видеть результат вставки.
Если в том же скрипте, то буферизация не поможет.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718095
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftВключите логирование запросов в MySQL, проверьте сколько времени выполняются запросы.
Включал slow_query_log с пределом в 1 секунду, запросы туда не попадают.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718107
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatestingmiksoftВключите логирование запросов в MySQL, проверьте сколько времени выполняются запросы.
Включал slow_query_log с пределом в 1 секунду, запросы туда не попадают.Если вас не устраивает время в 1 секунду, то уменьшайте порог.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718109
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatesting,

поле tb_uid что содержит?
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718116
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяполе tb_uid что содержит?
Уникальная строка, не обязательно числовая.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718126
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatestingУникальная строка, не обязательно числовая.одна из проблем
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718162
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

сейчас переформатировал таблицу, теперь она вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS `users_table` (
  `tb_uid` int(16) NOT NULL,
  `tb_pts` int(11) NOT NULL,
  `tb_gid` varchar(10) NOT NULL,
  `tb_time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `users_table`
 ADD UNIQUE KEY `uid` (`tb_uid`,`tb_gid`);


Т.е. уникальные пары tb_uid и tb_gid. Скорость не изменилась.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718171
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatesting,

Делайте не уникальный ключ, а первичный ключ из этих двух полей. Иначе будет добавлено неявное техническое поле для первичного ключа и замедлится доступ к записям таблицы.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718180
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Сделал, ничего не поменялось. Вкупе с тем фактом, что запросы не попадают в slow query log, проблема, скорее всего, на php-стороне, в соответствующем подфоруме уже указали на её возможный корень.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718184
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatestingВкупе с тем фактом, что запросы не попадают в slow query logЕсли не получается настроить slow query log, то включите общий лог запросов. Нужно понять реальное время выполнения запросов.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718189
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Так я включал лог медленных запросов, куда попадало всё от 1 секунды длиной – этих запросов там не было, были другие (select из таблицы с миллионами записей), но это уже не относится к теме.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718197
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatesting,

А почему от 1 секунды? Запросы явно должны быть быстрее, т.е. надо ставить меньше.
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718216
gpbetatesting
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Посмотрел, сами инсерты занимают порядка 0.0000хх секунд
...
Рейтинг: 0 / 0
Медленный insert при большой нагрузке
    #39718424
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gpbetatestingmiksoft,

Посмотрел, сами инсерты занимают порядка 0.0000хх секундТогда я не вижу проблем на стороне MySQL.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный insert при большой нагрузке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]