Среда: Rails 2.3.11, MySQL 5.1 (InnoDB)
В моем приложении Rails время от времени возникали проблемы с простыми запросами, выполнение которых занимало слишком много времени, а узкие места обновлялись. Эти запросы обычно относятся к форуму, разделу с самым высоким трафиком на сайте и к тому (с наибольшим количеством обновлений). Вот пример образца запроса, извлеченного из медленного журнала MySQL:
# Query_time: 46.900202 Lock_time: 0.000030 Rows_sent: 0 Rows_examined: 0
SET timestamp=1302172666;
UPDATE `forum_topics`
SET `views` = 153, `updated_at` = '2011-04-07 10:36:59'
WHERE `id` = 1213305;
Это очень простой запрос, который должен быть чрезвычайно быстрым, хотя в этом случае для его выполнения потребовалось почти 47 секунд. Средняя нагрузка на этот сервер никогда не превышает 2, так что это не проблема. Некоторые другие интересные объекты:
- Ни
views
, ни updated_at
не являются
индексируются.
- Хотя значение автоинкремента может
быть 1.2M, есть на самом деле только
70K записей в этой таблице.
- Более 90% всех запросов в журнале медленных запросов аналогичны этому.
Здесь я ищу несколько рекомендаций относительно следующих шагов, которые необходимо предпринять для решения этой проблемы.
Спасибо.
P.S. Схема / индексы следующие:
CREATE TABLE `forum_topics` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`forum_category_id` int(11) DEFAULT NULL,
`title` varchar(255) NOT NULL,
`sticky` tinyint(1) DEFAULT '0',
`views` int(11) DEFAULT '0',
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`last_post_created_at` datetime DEFAULT NULL,
`slug` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_forum_topics_on_created_at` (`created_at`),
KEY `index_forum_topics_on_forum_category_id` (`forum_category_id`),
KEY `index_forum_topics_on_sticky` (`sticky`)
) ENGINE=InnoDB AUTO_INCREMENT=1215414 DEFAULT CHARSET=utf8;