Tous les produits
Search
Centre de documentation

Lindorm:Partition index

Dernière mise à jour :Aug 11, 2026

Les tables larges volumineuses peuvent générer des points chauds de stockage et dégrader les performances des requêtes si toutes les données résident dans un seul shard d'index. L'indexation par partition résout ce problème en divisant un index de recherche en partitions plus petites, gérées indépendamment. Lors de la création d'un index de recherche, spécifiez une politique de partitionnement pour permettre au serveur de distribuer automatiquement les données. Lors des requêtes, le système utilise l'élimination des partitions (partition pruning) pour n'analyser que celles contenant les données correspondantes.

Deux politiques sont disponibles :

  • Partitionnement par hachage : achemine les lignes vers les partitions en hachant une colonne de clé de partition. Les requêtes d'égalité sur cette colonne déclenchent une élimination précise des partitions.

  • Partitionnement temporel : regroupe les enregistrements par plage de temps. Le système crée automatiquement de nouvelles partitions selon un calendrier glissant et supprime les partitions expirées en fonction d'une politique de durée de vie (TTL).

Prérequis

Avant de commencer, vérifiez que vous avez :

Choisir une politique de partitionnement

Utilisez ce tableau pour sélectionner la politique adaptée à votre charge de travail avant de créer un index.

Partitionnement par hachage Partitionnement temporel
Idéal pour Requêtes d'égalité sur une colonne à forte cardinalité (ID d'appareil, ID de magasin) Données de séries temporelles avec requêtes de plage sur une colonne d'horodatage (IoV, historiques de commandes, journaux de messages)
Élimination des partitions Déclenchée uniquement par des conditions d'égalité (=). Déclenchée par des conditions de plage temporelle. Analyse uniquement les partitions couvrant la période spécifiée.
Cycle de vie des données Les partitions persistent ; aucune TTL intégrée Partitions créées automatiquement selon un calendrier glissant ; anciennes partitions supprimées par TTL
Modification de la clé de partition Non autorisée après la création de l'index Sans objet
Limitations Jusqu'à trois niveaux d'imbrication ; ne peut pas être combiné avec le partitionnement temporel Nécessite une colonne d'horodatage dans l'index

Configurer une table de test

Tous les exemples de cette rubrique utilisent la table suivante. Créez-la avant d'exécuter les exemples.

CREATE TABLE IF NOT EXISTS search_table (
  user_id BIGINT,
  storeId VARCHAR,
  goodsId VARCHAR,
  goodsPrice SMALLINT,
  orderTime BIGINT,
  info VARCHAR,
  PRIMARY KEY (user_id ASC)
);

Partitionnement par hachage

Le partitionnement par hachage achemine les lignes vers les partitions en hachant la clé de partition. Les lignes ayant des valeurs de clé identiques aboutissent toujours dans le même groupe de partitions, de sorte qu'une requête d'égalité sur cette clé n'analyse que les partitions pertinentes.

Important

Impossible de modifier la configuration du partitionnement par hachage après la création de l'index. Estimez votre volume de données et le nombre cible de partitions avant de créer l'index.

Dimensionner correctement les partitions

Chaque partition doit contenir entre 50 millions et 100 millions d'enregistrements, pour une taille de stockage comprise entre 30 Go et 50 Go. Le nombre de partitions par défaut est le double du nombre de nœuds de recherche.

Créer un index partitionné par hachage

Par défaut (partition par clé primaire)

Sans clause PARTITION BY, l'index partitionne les données selon la clé primaire de la table large.

CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice);

Partition par colonne spécifique

Partitionnez par storeId avec 64 partitions. Utilisez cette option lorsque les requêtes incluent toujours une condition d'égalité sur storeId.

CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice)
PARTITION BY hash(storeId) PARTITIONS 64;

Utiliser le partitionnement multiniveau pour corriger la dissymétrie des données

Si la clé de partition principale entraîne une distribution inégale des données (points chauds), ajoutez une clé de partition secondaire pour répartir les données plus uniformément entre les partitions.

Important
  • Version 2.8.1 ou ultérieure du moteur de table large requise.

  • Version 3.9.22 ou ultérieure du moteur de recherche requise.

  • Le partitionnement multiniveau ne peut pas être combiné avec le partitionnement temporel.

Fonctionnement

Chaque clé de partition reçoit un salt_factor — un petit entier qui contrôle la finesse du hachage de cette clé. Le nombre total de partitions doit être une puissance de 2 (2^N), et la somme de toutes les valeurs salt_factor doit être égale à N.

Par exemple, avec 2 milliards d'enregistrements et une cible de 50 millions d'enregistrements par partition, vous avez besoin d'environ 40 partitions. Arrondissez à 64 (2^6), donc N = 6 et les facteurs de salage doivent totaliser 6.

Compromis : Augmenter le salt_factor pour une clé améliore la distribution des données selon cette dimension, mais réduit la précision de l'élimination lors des requêtes basées sur une autre clé. Par exemple, si storeId a un salt_factor=2, les requêtes sur storeId seul éliminent 1/4 (1/2^2) de toutes les partitions. L'augmenter à salt_factor=3 permet d'éliminer 1/8 de toutes les partitions, mais laisse moins de place aux autres clés pour contribuer à la distribution.

Exemple de partitionnement par hachage multiniveau

Partitionnez par storeId (salt_factor=2) et goodsId (salt_factor=4), avec 64 partitions au total. Les lignes ayant le même storeId mais des valeurs goodsId différentes sont distribuées sur 1/4 de toutes les partitions.

CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice)
PARTITION BY hash(storeId(salt_factor=2), goodsId(salt_factor=4)) PARTITIONS 64;

Utiliser `_id` comme clé de partition secondaire

Si aucune colonne métier secondaire appropriée n'est disponible, utilisez _id (la clé primaire composite de la table large) comme clé de partition secondaire pour résoudre les points chauds.

CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice)
PARTITION BY hash(storeId(salt_factor=2), _id(salt_factor=4)) PARTITIONS 64;

Partitionnement temporel

Le partitionnement temporel organise les données d'index en partitions par plage de temps, par exemple par semaine ou par mois. Le système crée automatiquement de nouvelles partitions selon un calendrier glissant et supprime les partitions dont les données ont dépassé la durée de vie (TTL).

Cycle de vie des partitions :

  1. Création : le système crée automatiquement de nouvelles partitions en fonction de RANGE_TIME_PARTITION_INTERVAL.

  2. Conservation : les données des partitions sont conservées pendant le nombre de jours défini par RANGE_TIME_PARTITION_TTL.

  3. Suppression : le système supprime automatiquement les partitions plus anciennes que la durée de vie (TTL).

Créer un index partitionné temporellement

Partitions hebdomadaires, conservation de 90 jours

Les partitions commencent 30 jours avant la création de l'index. Une nouvelle partition est créée tous les 7 jours. Les données datant de plus de 90 jours sont supprimées automatiquement.

CREATE INDEX idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice, orderTime)
PARTITION BY RANGE time(orderTime) PARTITIONS 4
WITH (
  indexState=ACTIVE,
  RANGE_TIME_PARTITION_START='30',
  RANGE_TIME_PARTITION_INTERVAL='7',
  RANGE_TIME_PARTITION_TTL='90'
);

Partitions mensuelles, conservation de 6 mois, horodatages à la seconde près

Les partitions commencent 180 jours avant la création de l'index. Une nouvelle partition est créée tous les 30 jours. Les données datant de plus de 180 jours sont supprimées automatiquement. La colonne orderTime stocke les horodatages Unix en secondes (valeurs à 10 chiffres).

CREATE INDEX idx USING SEARCH ON search_table (storeId, goodsId, goodsPrice, orderTime)
PARTITION BY RANGE time(orderTime) PARTITIONS 4
WITH (
  indexState=ACTIVE,
  RANGE_TIME_PARTITION_START='180',
  RANGE_TIME_PARTITION_INTERVAL='30',
  RANGE_TIME_PARTITION_TTL='180',
  RANGE_TIME_PARTITION_FIELD_TIMEUNIT='s'
);

Paramètres du partitionnement temporel

Paramètre Obligatoire Description
RANGE_TIME_PARTITION_START Oui Nombre de jours précédant la création de l'index à partir desquels commencer la création des partitions. Si l'horodatage des données historiques est antérieur à l'heure de début de partition, une erreur est signalée.
RANGE_TIME_PARTITION_INTERVAL Oui Intervalle en jours entre les partitions créées automatiquement. Par exemple, 7 crée une nouvelle partition chaque semaine.
RANGE_TIME_PARTITION_TTL Non Nombre de jours de conservation des données de partition. Les partitions plus anciennes que cette valeur sont supprimées automatiquement.
RANGE_TIME_PARTITION_FIELD_TIMEUNIT Non Unité de temps du champ de partition. Valeur par défaut : ms (millisecondes, horodatage à 13 chiffres). Définissez sur s pour les horodatages à la seconde près (10 chiffres).
RANGE_TIME_PARTITION_MAX_OVERLAP Non Intervalle maximal autorisé en jours entre un horodatage futur et l'heure actuelle. Si non défini, les horodatages futurs n'ont pas de limite supérieure.
RANGE_TIME_PARTITION_FORMAT Non Format d'écriture du champ de partition temporelle. Valeur par défaut : date_optional_time||epoch_millis. Prend effet lorsque le champ de partition est de type VARCHAR.
Important

RANGE_TIME_PARTITION_START définit la limite historique pour l'indexation. Par exemple, supposons que la date la plus ancienne dans la colonne orderTime soit le 16 mars 2021. Pour conserver toutes les données historiques, calculez le nombre de jours entre le 16 mars 2021 et le jour de création de l'index, puis définissez cette valeur comme RANGE_TIME_PARTITION_START. Si l'horodatage des données historiques est antérieur à l'heure de début de partition, une erreur est signalée.