2015-06-17 10 views
0

Предположим, что веб-приложение (PHP) с X00 000 запросов в минуту и ​​база данных SQL с примерно таким же количеством записей.Кэш/очередь для записи с высокой частотой

Каждый запрос вызывает несколько (< 5) db-файлов и одну запись db (в основном, обновление). Меня беспокоит проблема производительности, вызванная записью, и поиск решений для увеличения количества запросов в минуту.

Какие решения вы бы предложили, как бы вы их реализовали и почему?

Вещи, о которых я думал, включают в себя кеш для записи, который синхронизируется с db один раз каждые с некоторым интервалом времени или в очереди, такой как Gearman, или просто вставка SQL вставляется с задержкой.

Однако, поскольку ожидается, что одна и та же нагрузка будет постоянной, вставка с задержкой, вероятно, не поможет, когда загрузка сервера будет постоянно на уровне> 90%, поэтому я ищу способы значительно снизить нагрузку на сервер по сравнению с одиночной записью.

Благодаря

+0

Является ли обновление обязательным после чтения? – Mjh

+0

В предполагаемой проблеме, да. Рассмотрите отчет о состоянии, отправляемый каким-либо устройством, хотя это обновление может быть не более чем меткой времени для last_seen. – foaly

+1

Я голосую, чтобы закрыть вопрос как слишком широкий (хотя он также, похоже, основан на мнениях и требует рекомендации по программному обеспечению). Однако я добавлю, что у вас может быть прецедент, где база данных NOSQL с расслабленной функциональностью ACID может быть решением, которое вы ищете. –

ответ

1

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

Простой подход не обновляет основную таблицу, а вместо этого использует отдельную таблицу для изменяющихся значений (например, product_views) и изменяет ваши запросы на использование JOIN для извлечения значений. Используя этот подход, ваша основная (и большая) таблица будет в основном статичной и не затронутой недействительностью и блокировкой кеша запроса.

Более продвинутый подход заключается в том, чтобы НЕ использовать ОБНОВЛЕНИЯ, но INSERT. Вместо того, чтобы обновлять строку на каждом просмотре страницы, добавьте новое значение INSERT в таблицу temp (например, product_views_temp), поэтому каждый вид будет 1 строка. Затем планируйте задание cron, например каждые 5 минут, чтобы выполнить запрос, например SELECT COUNT(*) FROM product_views_temp GROUP BY prod_id, и на основе номеров обновите основную таблицу (должно быть возможно в 1 запросе). Главное преимущество заключается в том, что эти ВСТАВКИ быстрее, и вы можете иметь подсчеты в основной таблице, если вам нужна по какой-либо причине. Небольшим недостатком является то, что будет небольшая задержка, прежде чем посетители увидят обновленные подсчеты.

EDIT: Если вы можете позволить себе потерять данные рассчитывает на эти 5 минут, вы можете сделать его супер-быстро, создавая эту временную таблицу с MySQL MEMORY storage engine. Они очень быстрые для INSERT (но могут быть немного медленнее для UPDATE). Когда сервер выходит из строя/завершает работу, сама таблица все еще существует, но ее содержимое теряется.

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

+0

Привет, спасибо за ваш ответ. Отдельные таблицы для часто обновляемых значений, вероятно, будут прекрасными, так же как и небольшая задержка. Однако мое главное беспокойство заключается не в том, что обновления будут препятствовать чтению, а скорее, что огромное количество транзакций базы данных, большая часть которых пишет (т. Е. Особенно медленная), станет узким местом для всего приложения и позволит уменьшить запросов в минуту (чтение: обновления в минуту), чем при приличном кеше или очереди. Имею ли я смысл для вас? – foaly

+0

Если ваша база данных находится на RAID-контроллере с резервным кешем записи с резервным питанием, то INSERT будут очень быстрыми, так как фактические записи будут выполняться в фоновом режиме и не должны влиять на скорость вашего приложения. Вы также можете использовать временные таблицы в памяти ... – Marki555

+0

Быстрый взгляд на механизм памяти mysql показал, что они сами говорят, что он подходит для «шаблона доступа к данным только для чтения или чтения (ограниченные обновления)». шаблон доступа почти обновляется. Однако кластер MySQL может быть лучше для записи. Должен посмотреть, является ли это вариантом для MariaDB. БД будет в каком-то облаке, поэтому предположение о том, что оно должным образом скопировано. – foaly

Смежные вопросы