MySQL запрашивает зависание сайта
Недавно я перешел с учетной записи общего хостинга Dreamhost на Linode 512 Мб VPS. Переключение было довольно плавным для нормальной повседневной работы моего сайта, но некоторые проблемы с MySQL возникли. Немного предыстории моей установки, потому что я не уверен, что проблема с MySQL или нет:
- Ngnix 0.7.65
- Ubuntu 10.04 LTS
- MySQL 5.1.41
У меня проблема в том, что всякий раз, когда выполняется запрос, который не является частью нормальной работы сайтов... (это может быть что угодно, от оптимизации таблицы до выполнения SELECT COUNT, до выполнения запроса на удаление набора данных)... не позволяет всему веб-серверу загружать любые страницы. Все страницы на моем сайте имеют вызовы из базы данных, но страницы, которые не взаимодействуют с таблицей, над которой я работаю, по-прежнему не загружаются. Если вы попытаетесь зайти на страницу во время выполнения одного из этих запросов, она попытается загрузить примерно минуту или около того, прежде чем Nginx выдаст ошибку "502 Bad Gateway". Очевидно, что это не такая большая проблема для запроса COUNT, который занимает менее 5 секунд, но оптимизация таблиц может вывести сайт из загрузки страниц на 5+ минут.
У нас есть скрипт, который запускается по ночам, который извлекает 100000 лучших записей из нашей основной таблицы и сохраняет его в отдельной таблице для страницы рейтинга. На Dreamhost, когда этот скрипт выполнял рейтинговые страницы нашего сайта, он был бы пуст, но остальная часть сайта продолжала бы работать, однако на VPS ни одна страница на сайте не будет загружаться до тех пор, пока не будет выполнен ~6-минутный запрос.
Если больше информации поможет, пожалуйста, дайте мне знать, и я был бы рад предоставить. Я искал этот сайт, и Google довольно неуклонно пытается найти кого-то еще, кто сталкивался с подобной проблемой, но ничего не может найти. Ребята, вы думаете, что это просто проблема с MySQL, или это может быть вызвано моим Nginx? (на Dreamhost у меня был Apache).
Благодарю.
1 ответ
Подключитесь к вашему SQL-серверу и выполните запрос: "Показать список процессов". Это покажет вам все запущенные запросы и их текущее состояние. Вы должны ожидать увидеть почти все из них в состоянии LOCKED, что означает, что они ожидают завершения одного из других запросов. Те, кто не заблокирован, являются вашими кандидатами на роль виновника.