SQL-запросы ломают нашу игру! (Внутренний сервер загружен)

У нас есть игра для Facebook, в которой все постоянные данные хранятся в базе данных MySQL, работающей на большом экземпляре Amazon RDS. Размер одной из наших таблиц составляет 2 ГБ. Если я выполняю какие-либо запросы к этой таблице, которые занимают более пары секунд, любые действия SQL, выполняемые нашей игрой, завершатся с ошибкой:

HTTP/1.1 503 Служба недоступна: внутренний сервер перегружен

Это явно подрывает нашу игру!

Я отслеживал загрузку ЦП в экземпляре RDS в эти периоды, и, несмотря на скачки, она не превышала 50%. Раньше у нас был меньший размер инстанса, и он достиг 100%, поэтому я надеялся, что проблема будет решена, если увеличить мощность ЦП. Теперь я думаю, что это проблема с количеством открытых соединений. Однако я работаю с SQL всего 8 месяцев или около того, поэтому я не эксперт по настройке MySQL.

Возможно, есть какой-то параметр конфигурации, который я могу изменить, чтобы эти запросы не перегружали сервер, или мне просто не следует запускать их, пока наша игра запущена?

Я использую MySQL Workbench для выполнения запросов.

Любая помощь будет очень признательна - Спасибо!

РЕДАКТИРОВАТЬ:

Вот пример....

SELECT * 
FROM BlueBoxEngineDB.Transfer 
WHERE Amount = 1000 
AND FromUserId = 4 
AND Status='Complete';

Таблица выглядит так:

TransferId  Started  Status  Expires  FromUserId  ToUserId  CurrencyId  Amount  SessionId

1177    2012-06-04 21:43:18 Added       150001      2           4           1   12156
1179    2012-06-04 21:48:50 ISF         150001      2           4           1   12156
1181    2012-06-04 22:08:33 Added       150001      2           4           25  12156
1183    2012-06-04 22:08:41 Complete    150001      2           4           50  12156
1185    2012-06-04 22:08:46 Added       150001      2           4           200 12156

person TimH    schedule 29.11.2012    source источник
comment
Я предполагаю, что большая таблица уже имеет соответствующие индексы?   -  person Michael Fredrickson    schedule 30.11.2012
comment
Даже если размер таблицы составляет 2 ГБ, запросы обычно не должны занимать более нескольких секунд, если вы не слишком усложняете их. Опубликуйте пример запроса, EXPLAIN этого запроса и структуру таблицы. Запросы, исходящие от игры, записываются в таблицу, на которой вы выполняете запрос? Если да, то проблема может быть в замке.   -  person G-Nugget    schedule 30.11.2012
comment
Я просто вынул это с помощью этого простого запроса: SELECT * FROM BlueBoxEngineDB.Transfer WHERE Amount = 1000 AND FromUserId = 4;   -  person TimH    schedule 30.11.2012
comment
Дочитал до SELECT * .. первого номера. Вам действительно нужны все столбцы?   -  person Kieren Johnstone    schedule 30.11.2012
comment
Я согласен с G-Nugget и Майклом. У вас есть индекс FromUserId, Status и Amount? Индивидуальные индексы и один объединенный на удачу? Вы также можете попробовать советник по настройке SQL Database Engine. Поместите в него типичную рабочую нагрузку SQL-запросов, он предложит вам индексы, статистику и секционирование.   -  person Kieren Johnstone    schedule 30.11.2012
comment
Неважно, вы на MySQL..   -  person Kieren Johnstone    schedule 30.11.2012
comment
Серьезный ответ: наймите действительно хорошего администратора баз данных. Похоже, ваши проблемы выходят далеко за рамки сайта вопросов и ответов. Если это настоящий бизнес, наймите хороших сотрудников. РЕДАКТИРОВАТЬ: Сотрите это - просто попросите кого-нибудь проконсультироваться в течение дня или недели.   -  person Nick Vaccaro    schedule 30.11.2012
comment
Похоже, это больше подходит для ServerFault, чем для StackOverflow.   -  person Ken White    schedule 30.11.2012
comment
Если бы мы могли позволить себе администратора баз данных, мы бы наняли его за секунду. Но мы стартап, и наш бюджет на пределе. Это значит, что дело во мне! :П   -  person TimH    schedule 30.11.2012
comment
Итак... можете ли вы опубликовать EXPLAIN этого запроса и структуру таблицы?   -  person G-Nugget    schedule 30.11.2012
comment
Я разместил структуру таблицы. Что нужно пояснить относительно запроса?   -  person TimH    schedule 30.11.2012
comment
@TimH Вы не опубликовали структуру таблицы до такой степени, что она сообщает нам что-либо полезное об индексах, которые, вероятно, влияют на производительность запроса. Запустите SHOW CREATE TABLE BlueBoxEngineDB и опубликуйте результаты.   -  person Mike Brant    schedule 30.11.2012
comment
... также см. EXPLAIN, как получить выполнение простой.   -  person Leigh    schedule 30.11.2012


Ответы (3)


Вам ДЕЙСТВИТЕЛЬНО следует подумать о запуске RDS с высокой доступностью и настройке реплики чтения за его пределами. Таким образом, вы можете запускать сложные запросы к реплике в свое удовольствие и не мешать работе производственной базы данных.

База данных размером 2 ГБ (размером) на самом деле не такая уж большая. Если у вас есть правильные индексы для таблиц, которые вы пытаетесь запросить, вы не должны блокировать свою БД.

Прежде всего, не выполняйте запросы к производственной базе данных большой емкости, если вы не знаете, что она собирается делать. Из комментариев выше становится ясно, что вы не очень опытный администратор БД. Все нормально. Работа на большом сервере определенно будет для вас обучающим опытом, просто постарайтесь не делать уроки теми, на которых вы сломаете свой сервис. Опять же, именно поэтому наличие реплики или создание моментального снимка БД и настройка тестовой БД перед выполнением запросов к большим таблицам — очень хорошая идея.

person Mike Brant    schedule 30.11.2012
comment
На самом деле, только закончил делать это, когда я увидел ваш ответ. Это прекрасно работает! :) - person TimH; 01.12.2012

Индекс (FromUserId, Amount, Status), вероятно, очень поможет этому запросу.

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

Попробуйте проанализировать журнал медленных запросов, а затем оптимизировать самые медленные запросы (и те, которые используют больший процент ЦП).

person ypercubeᵀᴹ    schedule 30.11.2012

Вероятно, вам нужно настроить схему (добавление индексов непосредственный шаг).

Чтобы проанализировать вашу ситуацию, вы можете получить доступ к журналам медленных запросов MySQL для вашей базы данных, чтобы определить, есть ли медленные SQL-запросы, и если да, то характеристики производительности каждого из них. Вы можете установить параметр БД "slow_query_log" и запросить таблицу mysql.slow_log для просмотра медленных SQL-запросов. Дополнительные сведения см. в Руководстве пользователя Amazon RDS. .

Вероятно, некоторые из ваших таблиц следует перенести в DynamoDB или Redis. Оба они дают задержку в одноразрядные миллисекунды и поэтому очень популярны среди разработчиков игр. Вам просто нужно подумать о своей структуре данных.

person Guy    schedule 30.11.2012