У меня есть большая таблица с именем 'roomlogs', в которой содержится почти 1 миллион записей.Структура таблицы:
id -> PK
roomId -> varchar FK для таблицы комнат
userId -> varchar FK для таблицы пользователей
enterTime -> Дата и время
exitTime -> Дата и время
статус -> bool
У меня есть предыдущийиндексируя номер комнаты, я недавно добавил индекс для столбца userId.
Итак, когда я запускаю хранимую процедуру со следующим кодом, это занимает больше времени, как в среднем 50 секунд.Что это не должно занять.
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `enter_room`(IN pRoomId varchar(200), IN puserId varchar(50), IN ptime datetime, IN phidden int, pcheckid int, pexit datetime)
begin
update roomlogs set
roomlogs.exitTime = ptime,
roomlogs.`status` = 1
where
roomlogs.userId = puserId
and roomlogs.`status` = 0
and DATEDIFF(ptime,roomlogs.enterTime) = 0;
INSERT into roomlogs
( roomlogs.roomId,
roomlogs.userId,
roomlogs.enterTime,
roomlogs.exitTime,
roomlogs.hidden,
roomlogs.checkinId )
value
( pRoomId,
userId,
ptime,
pexit,
phidden,
pcheckid);
select *
from
roomlogs
where
roomlogs.id= LAST_INSERT_ID();
end ;;
DELIMITER ;
Что может быть причиной того, что это заняло так много времени:
- Недавно я добавил индекс, поэтому предыдущие строки не были проиндексированы.
- В настоящее время нет выбора типа хранилища для каких-либо индексов.Должен ли я изменить его на B-дерево?
- На моем веб-сайте я получаю 20-30 одновременных вызовов на другие процедуры, в то время как эта процедура имеет 10-20 одновременных вызовов, выполняет ли запрос на обновление в процедуре блокировку?Но в таблице MySQL.slow_logs для каждого запроса блокировка _time показывает 0.
- Есть ли другие причины для такого поведения?
Редактировать: Вот ТАБЛИЦА ШОУ:
CREATE TABLE `roomlogs` (
`roomId` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
`userID` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
`enterTime` datetime DEFAULT NULL,
`exitTime` datetime DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` int(11) DEFAULT '0',
`hidden` int(11) DEFAULT '0',
`checkinId` int(11) DEFAULT '-1',
PRIMARY KEY (`id`),
KEY `RoomLogIndex` (`roomId`),
KEY `RoomLogIDIndex` (`id`),
KEY `USERID` (`userID`)
) ENGINE=InnoDB AUTO_INCREMENT=1064216 DEFAULT CHARSET=utf8
Я также вижу, что этот запрос выполняется больше раз, например, 100000 раз в день (почти непрерывно).
SELECT count(*) from roomlogs where roomId=proomId and status='0';
Из-за того, что этот запрос читает из той же таблицы, блокирует ли InnoDB или создает запрос на обновление, потому что я вижу, что, когда хранимая выше процедура выполняется больше раз, чем этот запросбольше времени.
Вот ссылка для переменных MySQL: https://docs.google.com/document/d/17_MVaU4yvpQfVDT83yhSjkLHsgYd-z2mg6X7GwvYZGE/edit?usp=sharing