Cómo crear índices en SwiftData

Libranner Santos
15 enero, 20252min de lectura
Es fundamental optimizar las consultas a las bases de datos para asegurar que los usuarios disfruten de la mejor experiencia posible. Una de las estrategias más efectivas para lograr consultas eficientes es el uso de índices.
Los índices añaden metadatos a los modelos, especificando qué propiedades deben ser optimizadas, especialmente aquellas que se utilizan con frecuencia en operaciones de persistencia, ya sea de lectura o escritura.
Si quieres una introducción a Swift Data, te recomendamos este artículo.
El macro #Index
Consideremos el siguiente modelo:
import SwiftData@Modelclass Product {var name: Stringvar quantity: Intvar expirationDate: Datevar category: ProductCategory}
Este modelo representa una versión simplificada de una clase para una aplicación de inventario. Es común que la propiedad name
se utilice con frecuencia para realizar operaciones de filtrado, como búsquedas o consultas específicas.
Para agregar un índice al modelo, basta con incluir la siguiente línea de código:
#Index<Product>([\.name])
Con esta sola línea, hemos añadido un índice usando un keypath
con la propiedad name
del modelo. SwiftData se encargará automáticamente de optimizar las consultas relacionadas con esa propiedad.
Creando múltiples índices
Además, es posible agregar múltiples índices o incluso índices compuestos según sea necesario. Por ejemplo:
#Index<Product>(// 1[\.name],// 2[\.expirationDate],// 3[\.name, \.expirationDate])
En este ejemplo:
- Se crea un índice para la propiedad
name
. - Se añade otro índice para la propiedad
expirationDate
. - Finalmente, se define un índice compuesto que considera ambas propiedades:
[\.name, \.expirationDate]
.
Esto es especialmente útil cuando el diseño de nuestro esquema de datos incluye campos que suelen usarse conjuntamente en las consultas. Los índices compuestos permiten mejorar significativamente el rendimiento en estos casos.
Así se ve el código completo:
import SwiftData@Modelclass Product {#Index<Product>([\.name],[\.expirationDate],[\.name, \.expirationDate])var name: Stringvar quantity: Intvar expirationDate: Datevar category: ProductCategory}
Conclusión
Crear índices es una utilidad fundamental para trabajar con bases de datos, y ahora podemos crearlos en SwiftData gracias a los últimos desarrollos de Apple. Sin embargo, es importante tener cuidado de no abusar de esta herramienta, ya que podríamos afectar el rendimiento de escritura, ocupar más espacio del esperado y complicar el mantenimiento de la base de datos.