King
Новичок
MyISAM и deadlock'и
У меня есть таблица, к которой очень много UPDATE-, SELECT- и DELETE-запросов (по нескольку в секунду). Сайт стал «виснуть» (в списке выполняемых запросов ждало своей очереди до 20-ти запросов к этой таблице). Стуктура таблицы:
[sql]CREATE TABLE `_sessions` (
`sid` varchar(32) NOT NULL default '',
`account_id` int(11) NOT NULL default '0',
`bot_id` smallint(6) NOT NULL default '0',
`datetime` int(11) NOT NULL default '0',
`ip` int(10) unsigned NOT NULL default '0',
`dt` int(11) NOT NULL default '0',
`hidden` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`sid`),
KEY `datetime` (`datetime`),
KEY `account_id` (`account_id`),
KEY `bot_id` (`bot`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;[/sql]
Изначально у этой таблицы был тип MyISAM, но проблема в том, что этот тип поддерживает лишь блокировку на уровне таблицы, то есть обновления разных строк таблицы приводило к полной её блокировке в этот момент.
Я сменил на InnoDB, поскольку по умолчанию MySQL делает блокировку на уровне строк. Проблема ушла.
Но что меня смущает: в phpBB (3.x) есть таблица «phpbb_sessions» типа MyISAM, полная аналогия моей.
[sql]CREATE TABLE `phpbb_sessions` (
`session_id` varchar(32) collate utf8_bin NOT NULL default '',
`session_user_id` mediumint(8) unsigned NOT NULL default '0',
`session_last_visit` int(11) unsigned NOT NULL default '0',
`session_start` int(11) unsigned NOT NULL default '0',
`session_time` int(11) unsigned NOT NULL default '0',
`session_ip` varchar(40) collate utf8_bin NOT NULL default '',
`session_browser` varchar(150) collate utf8_bin NOT NULL default '',
`session_forwarded_for` varchar(255) collate utf8_bin NOT NULL default '',
`session_page` varchar(255) collate utf8_bin NOT NULL default '',
`session_viewonline` tinyint(1) unsigned NOT NULL default '1',
`session_autologin` tinyint(1) unsigned NOT NULL default '0',
`session_admin` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`session_id`),
KEY `session_time` (`session_time`),
KEY `session_user_id` (`session_user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;[/sql]
phpBB используется на многих посещаемых ресурсах, но довольно успешно работает.
Кто-нибудь может сказать в чём может быть причина того, что я с таблицей MyISAM так и не смог добиться стабильной работы, а в phpBB успешно это используется? Бегло смотрев код класса session в phpBB я убедился, что за одно обращение к странице выполняется не меньше запросов к этой таблице сессий, чем у меня. Никаких блокировок таблиц/транзакций в работе с сессиями я не использую.
У меня есть таблица, к которой очень много UPDATE-, SELECT- и DELETE-запросов (по нескольку в секунду). Сайт стал «виснуть» (в списке выполняемых запросов ждало своей очереди до 20-ти запросов к этой таблице). Стуктура таблицы:
[sql]CREATE TABLE `_sessions` (
`sid` varchar(32) NOT NULL default '',
`account_id` int(11) NOT NULL default '0',
`bot_id` smallint(6) NOT NULL default '0',
`datetime` int(11) NOT NULL default '0',
`ip` int(10) unsigned NOT NULL default '0',
`dt` int(11) NOT NULL default '0',
`hidden` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`sid`),
KEY `datetime` (`datetime`),
KEY `account_id` (`account_id`),
KEY `bot_id` (`bot`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;[/sql]
Изначально у этой таблицы был тип MyISAM, но проблема в том, что этот тип поддерживает лишь блокировку на уровне таблицы, то есть обновления разных строк таблицы приводило к полной её блокировке в этот момент.
Я сменил на InnoDB, поскольку по умолчанию MySQL делает блокировку на уровне строк. Проблема ушла.
Но что меня смущает: в phpBB (3.x) есть таблица «phpbb_sessions» типа MyISAM, полная аналогия моей.
[sql]CREATE TABLE `phpbb_sessions` (
`session_id` varchar(32) collate utf8_bin NOT NULL default '',
`session_user_id` mediumint(8) unsigned NOT NULL default '0',
`session_last_visit` int(11) unsigned NOT NULL default '0',
`session_start` int(11) unsigned NOT NULL default '0',
`session_time` int(11) unsigned NOT NULL default '0',
`session_ip` varchar(40) collate utf8_bin NOT NULL default '',
`session_browser` varchar(150) collate utf8_bin NOT NULL default '',
`session_forwarded_for` varchar(255) collate utf8_bin NOT NULL default '',
`session_page` varchar(255) collate utf8_bin NOT NULL default '',
`session_viewonline` tinyint(1) unsigned NOT NULL default '1',
`session_autologin` tinyint(1) unsigned NOT NULL default '0',
`session_admin` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`session_id`),
KEY `session_time` (`session_time`),
KEY `session_user_id` (`session_user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;[/sql]
phpBB используется на многих посещаемых ресурсах, но довольно успешно работает.
Кто-нибудь может сказать в чём может быть причина того, что я с таблицей MyISAM так и не смог добиться стабильной работы, а в phpBB успешно это используется? Бегло смотрев код класса session в phpBB я убедился, что за одно обращение к странице выполняется не меньше запросов к этой таблице сессий, чем у меня. Никаких блокировок таблиц/транзакций в работе с сессиями я не использую.