Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный insert при большой нагрузке / 23 сообщений из 23, страница 1 из 1
16.10.2018, 00:13
    #39717866
gpbetatesting
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный insert при большой нагрузке
Всем привет. Я в общем-то далеко не спец по 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
16.10.2018, 05:27
    #39717897
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный insert при большой нагрузке
gpbetatesting,

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

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

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

Всё-таки создал аналогичную тему в подфоруме по PHP.
...
Рейтинг: 0 / 0
16.10.2018, 12:20
    #39718048
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный insert при большой нагрузке
gpbetatestingПоконкретнее, нужно больше данных про устройство таблицы?чистый запрос, DDL таблицы
...
Рейтинг: 0 / 0
16.10.2018, 12:43
    #39718065
gpbetatesting
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный insert при большой нагрузке
вадячистый запрос
Код: 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
16.10.2018, 12:46
    #39718071
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный insert при большой нагрузке
gpbetatesting,

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

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

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


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

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

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

сейчас переформатировал таблицу, теперь она вида:
Код: 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
16.10.2018, 14:18
    #39718171
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный insert при большой нагрузке
gpbetatesting,

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

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

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

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

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

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


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