Présentation de TIN
TIN (Text INdex) est une extension GA pour PostgreSQL 18.6, proposée par PlanetScale. Elle se crée avec la syntaxe standard :
CREATE INDEX an_index_name ON table_name USING tin(text_column_name);et s’interroge via l’opérateur ==> : SELECT * FROM table_name WHERE text_column_name ==> 'some words';Les exigences fonctionnelles sont explicites : expressions booléennes, requêtes de phrase et de span, recherche floue, jokers, expressions régulières, gestion de la casse et des accents, comptages COUNT(*) et classements BM25 top‑k. L’extension doit également supporter les jointures, les clauses WHERE complexes, les mises à jour continues, la réplication, les sauvegardes et la visibilité transactionnelle.Architecture et mécanismes
Le moteur TIN repose sur des identifiants de document codés sur 48 bits, ce qui réduit l’empreinte mémoire tout en conservant l’unicité. Le processus d’indexation utilise l’élision de travail et la vectorisation SIMD, tirant parti des instructions AVX‑512 du processeur. Cette approche minimise les copies de données et accélère le calcul des poids BM25. Pour garantir la cohérence MVCC, TIN segmente les blocs d’index et applique un algorithme de fusion incrémentale, évitant les blocages lors des écritures concurrentes. Le résultat est un index dont la taille varie entre 33 % et 61 % du corpus, tout en restant exploitable avec 32 Go de RAM.
Benchmarks et performances
Les tests ont été menés sur une instance AWS i7i.8xlarge (CPU AVX‑512, stockage NVMe) avec 8 vCPU et 32 Go de RAM alloués à chaque conteneur PostgreSQL. Le corpus utilisé était un export Stack Exchange de 85 GB contenant 150 M de documents, avec 1 719 requêtes synthétiques (conjonction, disjonction, phrase). Les paramètres PostgreSQL modifiés étaient max_parallel_workers=8, shared_buffers=24GB et maintenance_work_mem=24GB. Comparaison avec les index concurrents :
TIN v1.0.2 8m10s 50.7 GB 32 GB RAM
ParadeDB v0.25.2 19m20s 52.1 GB 64 GB RAM
pg_textsearch v1.4 26m49s 41.5 GB 128 GB RAM
Postgres GIN v18.6 2h09m04s 28.0 GB 64 GB RAMDans un scénario de requêtes mixtes (conjonction, disjonction, phrase) avec classement BM25 top‑10 et sans écritures concurrentes, TIN a traité 25 fois plus de requêtes par seconde que ParadeDB, avec une latence p99 26 fois plus faible. GIN a échoué par manque de mémoire sur les recherches de disjonction, et pg_textsearch n’a pu exécuter que les recherches de disjonction, rendant les comparaisons incomplètes.Limites et perspectives
Les trois index alternatifs ont atteint les limites de RAM configurée (32 GB) lors de la construction, nécessitant une augmentation temporaire de la mémoire. TIN, en revanche, fonctionne entièrement dans la contrainte initiale, ce qui simplifie le déploiement en production. Le benchmark ne couvre pas les charges d’écriture intensives ni les scénarios de réplication multi‑région, ce qui laisse une zone d’incertitude sur la scalabilité horizontale. Enfin, l’évaluation repose sur un corpus synthétique ; les performances réelles peuvent varier selon la distribution de termes et la taille des documents dans des environnements spécifiques.