mirror of
https://github.com/immich-app/immich.git
synced 2026-10-18 14:36:41 +08:00
perf/sql-queries
albumIds/personIds/tagIds `all` filters used a correlated EXISTS (... GROUP BY assetId HAVING count(distinct id) = n). An EXISTS with an aggregate can't be turned into a semi-join, so it ran as a per-row SubPlan for every candidate asset walked in fileCreatedAt order; with rare or no matches that is the user's whole library. Use asset.id IN (... GROUP BY assetId HAVING ...) instead: same per-asset condition, aggregated once over the matching membership rows, and a normal semi-join the planner can cost. Results are identical. | user0 (920k set), take 100 | before | after | | --------------------------------- | ------- | ------ | | albumIds.all (150k + 10k album) | 1200 ms | 140 ms | | personIds.all (no common assets) | 2600 ms | 5 ms | | tagIds.all (parent+child, dense) | 37 ms | 80 ms | The dense-tag case is slower because the whole tag membership is grouped instead of stopping at the first 100 hits; the cost is now bounded by the size of the filtered albums/people/tags rather than the library.
…
…
…
High performance self-hosted photo and video management solution
Català Español Français Italiano 日本語 한국어 Deutsch Nederlands Türkçe 简体中文 正體中文 Українська Русский Български Português Brasileiro Svenska العربية Tiếng Việt ภาษาไทย മലയാളം
Warning
⚠️ Always follow 3-2-1 backup plan for your precious photos and videos!
Note
You can find the main documentation, including installation guides, at https://immich.app/.
Links
Demo
Access the demo here. For the mobile app, you can use https://demo.immich.app for the Server Endpoint URL.
Login credentials
| Password | |
|---|---|
| demo@immich.app | demo |
Features
| Features | Mobile | Web |
|---|---|---|
| Upload and view videos and photos | Yes | Yes |
| Auto backup when the app is opened | Yes | N/A |
| Prevent duplication of assets | Yes | Yes |
| Selective album(s) for backup | Yes | N/A |
| Download photos and videos to local device | Yes | Yes |
| Multi-user support | Yes | Yes |
| Album and Shared albums | Yes | Yes |
| Scrubbable/draggable scrollbar | Yes | Yes |
| Support raw formats | Yes | Yes |
| Metadata view (EXIF, map) | Yes | Yes |
| Search by metadata, objects, faces, and CLIP | Yes | Yes |
| Administrative functions (user management) | No | Yes |
| Background backup | Yes | N/A |
| Virtual scroll | Yes | Yes |
| OAuth support | Yes | Yes |
| API Keys | N/A | Yes |
| LivePhoto/MotionPhoto backup and playback | Yes | Yes |
| Support 360 degree image display | No | Yes |
| User-defined storage structure | Yes | Yes |
| Public Sharing | Yes | Yes |
| Archive and Favorites | Yes | Yes |
| Global Map | Yes | Yes |
| Partner Sharing | Yes | Yes |
| Facial recognition and clustering | Yes | Yes |
| Memories (x years ago) | Yes | Yes |
| Offline support | Yes | No |
| Read-only gallery | Yes | Yes |
| Stacked Photos | Yes | Yes |
| Tags | No | Yes |
| Folder View | Yes | Yes |
Translations
Read more about translations here.
Repository activity
Contributors
Description
Languages
TypeScript
53.3%
Dart
28.6%
Svelte
12.4%
Python
2.2%
Kotlin
1.4%
Other
1.9%