Идеальный дизайн для одновременной обработки множества вставок и запросов - PullRequest
2 голосов
/ 13 мая 2011

Хорошо, во-первых, я знаю, что люди скажут «зависит от данных, оборудования сервера и т. Д.» *

Я строю систему, в которой клиенты подключаются и отправляют мне данные. Эти данные обрабатываются, а затем в MySQL вставляется много строк. В то же время пользователи могут использовать наш веб-интерфейс для выполнения запросов к данным. Иногда запросы слишком медленные, чтобы возвращать результаты (100 - 200 секунд). Я знаю, что, возможно, есть некоторая оптимизация индекса и другие вещи, которые мы можем сделать, но я считаю, что отчасти проблема заключается в конкуренции между всеми вставками и запросами выбора, отправленными пользователем.

Существует ли общая архитектура / дизайн инфраструктуры, которая используется в этой ситуации для повышения производительности? Например, я думал о том, чтобы иметь два экземпляра mysql, в которых мастер получает все вставки, а ведомый обрабатывает запросы, но будет ли это меньше страдать от блокировок и конфликтов или это будет в основном то же самое, что и наличие одного экземпляра mysql? Я не эксперт по базам данных и большим наборам данных, поэтому любые ресурсы, которые вы можете предоставить, будут очень полезны. У меня есть книга по быстродействию MySQL, но я надеюсь получить от сообщества некоторую информацию.

16 ГБ оперативной памяти, 8 процессоров, Ubuntu, около 10 ГБ данных прямо сейчас, но растет довольно быстро. Использование innodb, но, вероятно, скоро начнёт использовать Percona Server, чтобы посмотреть, улучшится ли он вообще.

Ответы [ 3 ]

2 голосов
/ 13 мая 2011

Кэширует вставки в таблицу памяти
Если вам это не сойдет, вы можете сначала разрешить клиентам вставлять в отдельную таблицу MEMORY, а затем обновлять их в пакете с помощью INSERT DELAYED.

Это ускорит ваши вставки, потому что:

  1. Меньше трафика ввода-вывода, вы используете таблицу памяти в качестве оперативного кэша.
  2. Группируя вставки в таблицу на диске, вы экономите на стоимости ввода-вывода.
  3. Выполняя INSERT DELAYED, вы отдаете предпочтение SELECTS над INSERTS.
  4. Вы можете выбратьвремя выполнения INSERT (может быть ночью?)

Вы можете сделать то же самое для ОБНОВЛЕНИЙ.

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

SELECT и INSERT работают в одном потоке
Один SELECT или INSERT будет только когда-либоиспользуйте один поток.
С 8 процессорами по 4 ядра в каждом вы можете запускать как минимум 32 потока одновременно без узких мест в процессоре.Если у вас есть несколько вариантов выбора, работающих одновременно, может быть целесообразно установить 2 экземпляра MySQL (на отдельных портах) на один компьютер в режиме «главный-подчиненный».
Это не обычный вариант использования, хотя, как правило, многие операции выбора / вставкибудет работать в то же время.Проверьте, работают ли все ваши ядра.

Время вашего выбора и используйте объяснение
Чтобы увидеть, использует ли MySQL правильные индексы так, как вы их себе представляли.

Сделайте ваш основной индекс как можно короче
InnoDB MySQL включает первичный ключ в качестве покрывающего индекса для каждого вторичного индекса, поэтому убедитесь, что ваш PK короткий.INTEGER обычно является хорошим выбором.

Ссылки:
INSERT DELAYED: http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html
Настройка конфигурации: http://mysqldatabaseadministration.blogspot.com/2005/11/mysql-5-optimization-and-tuning-guide.html
Настройка конфигурации 2: http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/
ОБЪЯСНИТЬ: http://dev.mysql.com/doc/refman/5.5/en/explain.html

1 голос
/ 13 мая 2011

Обычно я делал это через настройку архитектуры базы данных Master / Slave.Основная БД обрабатывает фактически вставки и основные выборки, в то время как ведомая БД - это то, из чего фактически происходит отслеживание аналитики.

Редактировать:

Что делает ведомое устройство быстрее (кроме предположительно работающего на другом оборудовании)?Это потому, что обновления от master -> slave больше похожи на массовые обновления, а не на множество операторов вставки?

Это зависит от того, как вы его установили.Он может либо выполнять операторы, извлеченные из binlog, либо просто добавлять измененные строки.Какой из них вы хотите использовать, зависит от того, сколько вставок обычно выполняется за определенный период времени.Я бы порекомендовал посмотреть, как репликация MySQL работает за кулисами:

http://dev.mysql.com/doc/refman/5.1/en/replication-implementation.html

Как часто ваш мастер синхронизируется с ведомым?

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

0 голосов
/ 13 мая 2011

Использование InnoDB - хороший первый шаг: он предотвращает блокировку таблицы при вставках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...