Mysql Запрос на обновление таблицы очень медленный и растет с каждым днем - PullRequest
1 голос
/ 06 января 2020

У нас есть таблица, которая только для запроса на обновление занимает почти 200-300 секунд, общий размер данных - почти 3 357 196 строк. К нему прикреплены ключи, и запрос на выбор очень быстрый. Только запрос на обновление занимает много времени.

Mysql ДБ: InnoDB


CREATE TABLE `t_strava_push` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `strava_user` int(20) DEFAULT NULL,
  `strava_workout` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `type` varchar(45) COLLATE utf8_bin DEFAULT NULL,
  `aspect` varchar(45) CHARACTER SET utf8 DEFAULT NULL,
  `event_time` int(20) DEFAULT NULL,
  `body` varchar(255) COLLATE utf8_bin DEFAULT NULL,
  `processed` int(1) NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  KEY `strava_user` (`strava_user`),
  KEY `strava_workout` (`strava_workout`)
) ENGINE=InnoDB AUTO_INCREMENT=3377747 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Запрос, который мы пытаемся обновить:

UPDATE t_strava_push SET processed = 3 WHERE strava_workout = 2677850786

Таблица постоянно обновляется заданием cron, которое работает каждые 2 минуты. И много данных приходит на стол каждую минуту.

Проверьте здесь MySQL профилирование

Таблица Подробнее

Проверьте процесс, который выполняется в этом таблица

1 Ответ

5 голосов
/ 06 января 2020

strava_workout - это строка. Но вы сравниваете его как число, так что индекс не используется.

Сохраняйте согласованность типов!

UPDATE t_strava_push
    SET processed = 3
    WHERE strava_workout = '2677850786';
...