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

Оглавление

  • Понимание индексов IndexedDB
    – Что такое индексы IndexedDB?
    – Важность индексов в IndexedDB.
  • Создание индексов в IndexedDB
    – Структура хранилища объектов и путь к ключу
    – Определение индексов во время настройки базы данных
  • Запрос данных с помощью индексов IndexedDB
    — Основные запросы с использованием индексов
    — Фильтрация данных с помощью запросов диапазона
    — Сортировка данных с помощью индексов
  • Обслуживание индексов и обновление схемы
    — Добавление новых индексов в существующие хранилища объектов
    — Изменение или удаление существующих индексов
  • Вопросы производительности и рекомендации
    — Выбор правильных индексов IndexedDB
    — Ограничение размера индекса и влияние на производительность
    — Мониторинг производительности индекса

Понимание индексов IndexedDB

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

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

Создание индексов в IndexedDB

Структура хранилища объектов и путь к ключу
Прежде чем приступить к созданию индексов, важно понять структуру хранилища объектов в IndexedDB. Хранилище объектов содержит записи, и каждая запись имеет ключ и значение. Ключ может быть сгенерирован автоматически (автоинкрементировано) или предоставлен вручную. Значением может быть любой объект JavaScript.
Путь к ключу хранилища объектов определяет свойство или свойства, используемые в качестве ключа для записей. При создании индексов ключевой путь указывает свойство или свойства, которые необходимо индексировать.

Определение индексов во время настройки базы данных
На этапе настройки базы данных вы можете определить индексы для хранилищ объектов. Давайте посмотрим на пример:

let request = indexedDB.open("MyDatabase", 1);

request.onupgradeneeded = function(event) {
  let db = event.target.result;

  let objectStore = db.createObjectStore("MyObjectStore", { keyPath: "id" });

  // Create an index on the "name" property
  objectStore.createIndex("nameIndex", "name", { unique: false });
};

В приведенном выше примере мы создаем хранилище объектов с именем «MyObjectStore» с ключевым путем «id». Затем мы создаем индекс с именем «nameIndex» для свойства «name». Метод createIndex() используется для определения индекса с указанием имени индекса, пути к ключу и параметров (таких как уникальность).

Запрос данных с помощью индексов IndexedDB

Основные запросы с использованием индексов
После определения индексов вы можете использовать их для эффективного запроса данных. Метод openCursor() позволяет перебирать записи с помощью индекса. Вот пример:

let transaction = db.transaction("MyObjectStore", "readonly");
let objectStore = transaction.objectStore("MyObjectStore");
let index = objectStore.index("nameIndex");

let cursorRequest = index.openCursor();

cursorRequest.onsuccess = function(event) {
  let cursor = event.target.result;
  if (cursor) {
    // Access the current record
    console.log(cursor.value);

    // Move to the next record
    cursor.continue();
  }
};

В приведенном выше примере мы открываем курсор по индексу «nameIndex» хранилища объектов «MyObjectStore». Затем мы можем перебирать записи, получая доступ и обрабатывая каждую запись по мере необходимости.

Фильтрация данных с помощью запросов диапазона IndexedDB
Индексы также поддерживают запросы диапазона, что позволяет фильтровать данные на основе диапазона значений. Вот пример получения записей в пределах определенного диапазона возрастов:

let transaction = db.transaction("MyObjectStore", "readonly");
let objectStore = transaction.objectStore("MyObjectStore");
let index = objectStore.index("ageIndex");

let range = IDBKeyRange.bound(18, 30); // Records with age between 18 and 30

let cursorRequest = index.openCursor(range);

cursorRequest.onsuccess = function(event) {
  let cursor = event.target.result;
  if (cursor) {
    // Process the record within the desired age range
    console.log(cursor.value);

    // Move to the next record
    cursor.continue();
  }
};

В этом примере мы создаем диапазон, используя IDBKeyRange.bound(), чтобы указать минимальное и максимальное значения возраста. Курсор будет перебирать записи только в этом возрастном диапазоне.

Сортировка данных с помощью индексов
Индексы также можно использовать для сортировки данных в IndexedDB. Открыв курсор на индексе и указав желаемый порядок сортировки, вы можете получить записи в нужном порядке.

let transaction = db.transaction("MyObjectStore", "readonly");
let objectStore = transaction.objectStore("MyObjectStore");
let index = objectStore.index("nameIndex");

let cursorRequest = index.openCursor(null, "next"); // Sorted in ascending order

cursorRequest.onsuccess = function(event) {
  let cursor = event.target.result;
  if (cursor) {
    // Process the record
    console.log(cursor.value);

    // Move to the next record
    cursor.continue();
  }
};

В этом примере мы открываем курсор по индексу «nameIndex» и указываем порядок сортировки «следующий», который представляет порядок возрастания. Чтобы получить записи в порядке убывания, вы можете использовать «предыдущий» в качестве порядка сортировки.

Обслуживание индекса и обновление схемы

Добавление новых индексов в существующие хранилища объектов
Чтобы добавить новые индексы в существующее хранилище объектов, необходимо выполнить процесс обновления базы данных. Вот пример добавления нового индекса во время обновления базы данных.

let request = indexedDB.open("MyDatabase", 2);

request.onupgradeneeded = function(event) {
  let db = event.target.result;
  let objectStore = db.createObjectStore("MyObjectStore", { keyPath: "id" });

  // Add a new index during upgrade
  objectStore.createIndex("newIndex", "newProperty", { unique: false });
};

В этом примере мы обновляем версию базы данных с 1 до 2 и добавляем новый индекс с именем «newIndex» в свойство «newProperty».

Изменение или удаление существующих индексов
Для изменения или удаления существующих индексов также требуется обновление базы данных. Вы можете использовать метод deleteIndex() для удаления индекса или создать новый индекс с тем же именем, чтобы заменить существующий индекс. Не забудьте обработать соответствующее событие обновления и соответствующим образом обновить хранилище объектов.

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

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

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

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