Почему этот запрос такой медленный? - PullRequest
1 голос
/ 09 января 2011

Этот запрос появляется в журнале медленных запросов mysql: он занимает 11 секунд.

INSERT INTO record_visits
( record_id, visit_day )
VALUES
( '567', NOW() );

Таблица содержит 501043 записей, и ее структура выглядит следующим образом:

CREATE TABLE IF NOT EXISTS `record_visits` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `record_id` int(11) DEFAULT NULL,
  `visit_day` date DEFAULT NULL,
  `visit_cnt` bigint(20) DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `record_id_visit_day` (`record_id`,`visit_day`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

Что может быть не так? Почему эта вставка занимает так много времени?

UPDATE

Я выяснил, в чем причина всех неприятностей. На этой таблице был создан очень тяжелый триггер «ON INSERT». Вместе с блокировкой таблицы MyISAM это дало огромное время запроса для запроса INSERT. Вероятно, поэтому @Oswald в комментариях не смог воспроизвести эту ситуацию.

Настоящая проблема здесь в том, что MySQL не регистрирует запросы внутри триггеров, и вы всегда должны помнить о них при профилировании вашего приложения.

Спасибо за вашу помощь, все, принимая ответ, который был закрыт для решения.

Ответы [ 3 ]

2 голосов
/ 09 января 2011

Я подозреваю, что не сам запрос является медленным, но вы выполняете другие запросы на сервере, который блокирует таблицу.MyISAM использует блокировку на уровне таблицы, поэтому запрос, которому нужна данная таблица, заблокирует все другие запросы, которым нужна эта таблица, даже если они касаются разных строк.Например, если у вас часто бывают длительные запросы SELECT, ваши запросы INSERT, UPDATE и DELETE не смогут выполняться до тех пор, пока не завершатся все операции выбора, которые выполнялись при выполнении запроса.

Если вы скажете SHOWPROCESSLIST из другого приглашения во время выполнения вставки вы, вероятно, увидите, что он находится в состоянии «заблокировано».Если окажется, что это другое состояние, и нет длительных селекторов, блокирующих его, вы должны опубликовать это, потому что это также поможет сузить проблему.

1 голос
/ 09 января 2011

Я думаю, что при попытке добавить данные в эту таблицу mysql проверяет все record_id_visit_day строки из-за уникального индекса.

0 голосов
/ 09 января 2011

Я не знаю MySQL, но подразумевает ли UNIQUE KEY, что в столбце visit_day есть индекс?Если нет, попробуйте создать его.

...