2011-01-09 3 views
1

Этот запрос появляется в журнале запросов mysql slow: он занимает 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 ; 

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

UPDATE

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

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

Благодарим вас за помощь, каждый, принимая ответ, который закрывается для решения.

+0

Помогает ли перезагрузка службы MySQL Server? –

+1

Возможно, из-за вашего УНИКАЛЬНОГО индекса. Но это не должно быть медленным. – alexn

+0

@Time Machine no, после перезагрузки он остается прежним. –

ответ

2

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

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

0

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

+0

UNIQUE KEY означает, что на столбцах 'record_id' и 'visit_day' есть индекс из 2 столбцов. Насколько я знаю, добавление индексов только замедляет вставки и обновления вниз, как это поможет? –

+0

Уникальный ключ необходимо проверять каждый раз, когда должна быть сделана вставка. Поэтому, если у вас есть уникальный ключ, но нет индекса, каждый индекс приводит к последовательной проверке по ключевым столбцам, чтобы не было дублирующегося значения. – Daniel

+0

Я читал уникальное объявление неправильно, но я предполагаю, что вам нужен комбинированный индекс для обоих ключей. – Daniel

1

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

Смежные вопросы