Масштабируемость использования MySQL в качестве базы данных типа «ключ-значение»

Мне интересно узнать о влиянии на производительность использования MySQL в качестве базы данных "ключ-значение" по сравнению, скажем, с Redis/MongoDB/CouchDB. В прошлом я использовал как Redis, так и CouchDB, поэтому хорошо знаком с вариантами их использования и знаю, что лучше хранить пары ключ/значение, скажем, в NoSQL, а не в MySQL.

Но вот ситуация:

  • в большинстве наших приложений уже есть множество таблиц MySQL
  • Мы размещаем все на Heroku (у которого есть только MongoDB и MySQL, и в основном это тип 1-db для каждого приложения).
  • в этом случае мы не хотим использовать несколько разных баз данных.

Итак, в основном, я ищу некоторую информацию о масштабируемости наличия таблицы ключ/значение в MySQL. Возможно, на трех разных произвольных уровнях:

  • 1000 записей в день
  • 1000 записей в час
  • 1000 записей в секунду
  • 1000 чтений в час
  • 1000 чтений в секунду

Практическим примером является создание чего-то вроде трекера веб-аналитики MixPanel в реальном времени, для чего потребуется написать очень часто в зависимости от трафика.

Wordpress и другое популярное программное обеспечение используют это все время: у Post есть модель «Meta», которая представляет собой просто ключ / значение, поэтому вы можете добавлять произвольные свойства к объекту, по которому можно искать.

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

Что вы думаете?


person Lance Pollard    schedule 19.06.2010    source источник
comment
bret.appspot.com/entry/how-friendfeed-uses-mysql   -  person mmx    schedule 20.06.2010


Ответы (5)


Нет никаких сомнений в том, что использование решения NOSQL будет быстрее, поскольку оно проще.
NOSQL и реляционное решение не конкурируют друг с другом, это разные инструменты, которые могут решать разные задачи.
Это сказано для 1000 операций записи в день или час, у MySQL не будет проблем.
Для 1000 записей в секунду вам понадобится какое-то модное оборудование. Для решения NOSQL вам, вероятно, все еще понадобится некоторая распределенная файловая система.

Это также зависит от того, что вы храните.

person Romain Hippeau    schedule 19.06.2010
comment
без какой-либо настройки я получил 4000 вставок в секунду в innodb на моем celeron 1.8ghz - person zerkms; 20.06.2010

Я бы сказал, что вам придется запустить свой собственный тест, потому что только вы знаете следующие важные аспекты:

  • размер данных, которые будут храниться в этой таблице KV
  • уровень параллелизма, которого вы хотите достичь
  • количество существующих запросов, достигающих вашего экземпляра MySQL

Я бы также сказал, что в зависимости от требований к надежности этих данных вы также захотите протестировать несколько движков: InnoDB, MyISAM.

Хотя я ожидаю, что некоторые решения NoSQL будут быстрее, исходя из ваших ограничений, вы можете обнаружить, что MySQL будет работать достаточно хорошо для ваших требований.

person alexpopescu    schedule 20.06.2010

SQL базы данных все больше и больше используются в качестве уровня сохраняемости, а вычисления и доставка кэшируются в Key-Value репозиториях.

Имея это в виду, эти ребята провели настоящий тест:

  • InnoDB вставляет 43 000 записей в секунду на пике*;
  • TokuDB вставляет 34 000 записей в секунду НА МАКСИМАЛЬНОМ МАКСИМАЛЬНОМ* значении*;
  • Этот KV вставляет 100 миллионов записей в секунду (в 2000+ раз больше).

Чтобы ответить на ваш вопрос, репозиторий Key-Value, скорее всего, превзойдет MySQL на несколько порядков:

Обработка 100,000,000 элементов:

kv_add()....time:....978.32 ms
kv_get().....time:....297.07 ms
kv_free()....time:........0.00 ms

Хорошо, ваш тест был 1,000 операций в секунду, но не помешает сделать в 1,000 раз больше!

Дополнительные сведения см. в этом (они также сравнивают это с Tokyo Cabinet).

person Marit    schedule 05.02.2011
comment
Ссылка мертва, и в веб-архиве также нет ее копии. Есть какая-то альтернатива? - person E. Körner; 28.03.2021

Ознакомьтесь с серией сообщений в блоге здесь, где автор проводит тесты, сравнивающие производительность MongoDB и MySQL, и борется с MySQL. бардак с настройкой производительности. MongoDB выполнял ~ 100 000 операций чтения строк в секунду, MySQL в режиме c/s делал максимум 43 КБ, но со встроенной библиотекой ему удалось увеличить скорость чтения до 172 000 строк в секунду.

Звучит немного сложно достичь такого высокого уровня на одном узле, так что ymmv.

Вопрос записи/второго немного сложнее, но это все же может дать вам некоторые идеи о конфигурациях, которые стоит попробовать.

person mark    schedule 28.08.2012

Вы должны сначала реализовать это самым простым способом, а затем сравнить это. Всегда тестируйте вещи. Это означает:

  • Создайте схему, соответствующую вашему варианту использования.
  • Создавайте запросы, соответствующие вашему варианту использования.
  • Создавайте значительные объемы фиктивных данных, представляющих ваш вариант использования.
  • В различных циклах, в том числе как с произвольным доступом, так и с последовательным доступом, сравните его.
  • Убедитесь, что вы используете параллелизм (запускайте множество процессов, случайным образом забивающих сервер всевозможными запросами, характерными для ваших вариантов использования).

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

Потом попробуй оптимизировать.

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

Многие люди ассоциируют определенные вещи с медленностью, такие как SQL, RELATIONAL, JOINS, ACID и т. д.

При использовании реляционной базы данных, поддерживающей ACID, вам не обязательно использовать ACID или отношения.

Хотя соединения имеют плохую репутацию как медленные, это обычно сводится к неправильным представлениям о соединениях. Часто люди просто пишут плохие запросы. Это усложняется, поскольку SQL является декларативным, он может ошибаться, особенно с JOIN, где часто существует несколько способов выполнить соединение. То, что люди на самом деле получают от NoSQL в этом случае, является обязательным. NoDeclaritive было бы более точным, так как это проблема с SQL, с которой сталкиваются многие люди. Довольно часто людям просто не хватает индексов. Это не аргумент в пользу объединения, а скорее для того, чтобы показать, где люди могут ошибаться в скорости.

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

Для сравнения, решения NoSQL в первую очередь разрабатываются для поддержки различных режимов масштабирования «из коробки». Производительность отдельного узла может быть не совсем такой, как вы ожидаете. Решения NoSQL также борются за общее использование, поскольку многие из них имеют довольно необычные характеристики производительности или ограниченный набор функций.

person jgmjgm    schedule 18.04.2019