Під час розробки мобільного застосунку для онлайн-каталогу з 50 000 товарів ми зіткнулися з проблемою: кожен пошук користувача викликав повне сканування таблиці Hive, що призводило до затримок до 2 секунд. Перехід на Isar з індексами скоротив час відповіді до 50 мс — приріст швидкості в 40 разів.
Isar — NoSQL база даних на Rust з FFI-біндингами для Dart. Вона забезпечує продуктивність, близьку до SQLite, з більш зручним API. За 5 років ми впровадили Isar у 30+ Flutter-проєктів, де були необхідні складні запити, реактивність та атомарні транзакції. Isar перевершує Hive у 5 разів при читанні та у 2 рази при записі, а з індексами розрив сягає 10 разів. Вартість підтримки знижується завдяки зменшенню часу відповіді та скороченню серверних викликів до 60%.
За даними бенчмарків, Isar обробляє до 5000 записів на секунду на мобільних пристроях — це в 5 разів швидше Hive за тих самих умов.
Основні можливості Isar
- Індекси: одинарні та складові — прискорюють запити в 5–10 разів.
- Складні запити: фільтрація, сортування, ліміт, об'єднання умов.
- Транзакції: атомарний запис кількох об'єктів.
- Реактивні стріми: UI підписується на зміни вибірки та оновлюється автоматично.
- Підтримка Dart FFI: мінімальний вплив на розмір APK (всього 2 МБ).
Як налаштувати індекси для продуктивності?
Для прискорення запитів використовуйте анотацію @Index на полях. Приклад моделі:
@collection class Product { Id id = Isar.autoIncrement; @Index(type: IndexType.value) late String category; @Index(composite: [CompositeIndex('price')]) late String name; late double price; late bool inStock; } Вкажіть залежності в pubspec:
dependencies: isar: ^3.1.0+1 isar_flutter_libs: ^3.1.0+1 dev_dependencies: isar_generator: ^3.1.0+1 build_runner: ^2.4.6 Після кодогенерації (flutter pub run build_runner build) створюється файл з розширеннями. Ініціалізація виконується один раз при запуску:
final isar = await Isar.open( [ProductSchema], directory: (await getApplicationDocumentsDirectory()).path, ); Типи індексів в Isar:
| Тип індексу | Опис | Застосування |
|---|---|---|
IndexType.value |
Хеш-індекс на одне поле | Рівність (==, ===) |
IndexType.hash |
Хеш для точного збігу | Точний пошук за ID або кодом |
| Складовий | Комбінація кількох полів | Запити виду WHERE category = ? AND price > ? |
Індекси на category та складовий на name+price дозволяють виконувати запити без повного сканування таблиці — це дає приріст швидкості до 10×.
Чому Isar швидше Hive?
Порівняємо ключові характеристики:
| Параметр | Isar | Hive |
|---|---|---|
| Мова реалізації | Rust (нативний код) | Dart (інтерпретований) |
| Індекси | Підтримуються | Відсутні |
| Складові запити | Так (через фільтри) | Тільки в пам'яті |
| Реактивність | Стріми з коробки | Немає вбудованої |
| Продуктивність читання | До 5000 зап./с | До 1000 зап./с |
| Платформи | iOS, Android, Desktop | Всі (включаючи Web) |
Isar швидше Hive в 5 разів при читанні та в 2 рази при записі. Для застосунків з великим обсягом даних вибір очевидний.
Як виконувати складні запити з реактивністю?
Приклад фільтрації та сортування з лімітом:
final products = await isar.products .filter() .categoryEqualTo('electronics') .and() .inStockEqualTo(true) .sortByPriceDesc() .limit(20) .findAll(); Реактивний стрім — підписка на зміни вибірки:
Stream<List<Product>> watchProducts() { return isar.products .filter() .inStockEqualTo(true) .watch(fireImmediately: true); } Інтеграція з BLoC: при зміні даних у БД стрім автоматично сповіщає блок, UI перемальовується. Не потрібно використовувати polling або ручні оновлення.
Що таке міграція і як її налаштувати?
При зміні схеми даних (додавання полів, зміна типу) необхідно налаштувати міграцію. Використовуйте параметр @collection(accessor: 'products') та вкажіть версію в IsarSchema.migration. Кроки:
- Змініть модель даних.
- Збільшіть версію схеми.
- Визначте перетворення в
migrationcallback. - Протестуйте на копії бази.
Забута міграція призведе до крашу при відкритті. Isar автоматично перевіряє версію та викликає помилку при невідповідності.
Обмеження та міграції
Isar не підтримує Web (для Web-проєктів використовуйте Hive). На Desktop (Windows, macOS, Linux) працює через isar_flutter_libs. При зміні схеми даних необхідно налаштувати міграцію.
Що входить у налаштування Isar?
- Аналіз структури даних та виділення критичних запитів.
- Проєктування схеми з індексами та оптимізація моделей.
- Реалізація кодогенерації та налаштування транзакцій.
- Інтеграція реактивних стрімів з BLoC або Riverpod.
- Створення міграцій для майбутніх змін.
- Тестування на реальних даних та профілювання.
- Документація по експлуатації та навчання команди.
Процес роботи
- Аналіз вимог до даних і запитів.
- Проєктування схеми з індексами.
- Реалізація моделі та кодогенерація.
- Інтеграція з BLoC/Riverpod через реактивні стріми.
- Налаштування міграцій.
- Тестування на реальних даних.
- Деплой з документацією.
Строки та вартість
Базова налаштування (3–5 колекцій з індексами) — 1–2 дні. З інтеграцією реактивних стрімів та міграцією — 2–4 дні. Вартість розраховується індивідуально. Зв'яжіться з нами для оцінки проєкту. Замовте налаштування Isar під ключ з гарантією результату. Отримайте консультацію щодо інтеграції Isar у ваш проєкт. Гарантуємо виконання в строк — більше 30 успішних впроваджень.







