Индексирование и кэширование

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

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

Случаи использования

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

  • Создание фильтров панели мониторинга
  • Анализаторы отчетов
  • Глубокий фильтр истории

Общий подход

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

У нас есть переменная с именем dataSource. Предположим, что в этом массиве будет много данных, и для фильтрации данных из массива у нас есть метод с именем searchInDataSource, который будет использовать Array.filter для возврата данных из ключа name.

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

Когда мы должны использовать индексацию?

Есть несколько блокировщиков, которые поставляются с индексацией. Первая и самая важная — это космическая сложность.

В общем случае подход к пространственной сложности равен O(N), где N — отфильтрованная запись, но в случае индексации нам потребуется дополнительное пространство для хранения проиндексированных данных, что приведет к увеличению пространственной сложности, но загвоздка здесь в том, что мы требуется только один раз индексировать процесс, поэтому при загрузке сложность пространства составляет O (M * K), где M - общее количество уникальных записей в поле, а K - общее количество требуемых индексов.

Далее нужно управлять индексами для каждой операции. Мы должны обновить индексы для каждой операции из Create/Edit/Delete.

Создание и поиск по индексам

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

Здесь мы храним сами данные, но в идеальном случае вы можете сохранить индекс источника данных и получить запись с временной сложностью O(1).

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

Управление индексами

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

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

Сложности времени

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

  • Читать — О(1)
  • Создать — О(1)
  • Обновление — O (N * K), где N — общее количество элементов для определенного ключа индекса, а K — общее количество индексов.
  • Удалить — O (N * K), где N — общее количество элементов для определенного ключа индекса, а K — общее количество индексов.

Заключение

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

Удачного кодирования!

Создавайте приложения с повторно используемыми компонентами, такими как Lego.

Инструмент с открытым исходным кодом Bit помогает более чем 250 000 разработчиков создавать приложения с компонентами.

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

Подробнее

Разделите приложения на компоненты, чтобы упростить разработку приложений, и наслаждайтесь наилучшими возможностями для рабочих процессов, которые вы хотите:

Микро-интерфейсы

Система дизайна

Совместное использование кода и повторное использование

Монорепо

Узнать больше