Мне трудно понять, где существуют узкие места, связанные с чтением данных с диска в коллекции базы данных Mon go. Я знаю, что индексы являются огромным фактором оптимизации запросов, но, скажем, у нас есть коллекция без индексов, и я выполняю простой запрос в коллекции с 25 миллионами записей размером около 50 ГБ:
db.customers.find({ first_name: "xyz" })
Конечно , это должно запустить COLLSCAN
, поэтому он очень медленный (если он не кэшируется в памяти). Но насколько медленный является существенным в нашем случае. Выполнение некоторых тестов показывает, что машина, на которой я выполняю этот запрос, не привязывает мои доступные IOPS. На машине с макс. ~ 10K считыванием IOPS этот простой запрос удушается на отметке 1.2K . Обратите внимание на процессор iowait
Запрос явно ограничен диском, но он не использует весь потенциал того, что доступно на машине. Интересно, что когда я создаю другое соединение с базой данных и выполняю два запроса асинхронно, загрузка IOPS увеличивается в 2 раза. Кажется, что каждый запрос может сканировать только столько данных на диске за раз. Что сдерживает это при выполнении этих запросов, которые не имеют индексов?
В долгосрочной перспективе, я думаю, что подключение механизма Elasticsearch к этому поможет при попытке сложного поиска по множеству разнообразных данных, но я действительно Любопытно, почему мы не можем масштабировать вертикально в этом случае.