MariaDB : réindexation des index Full-Text

MariaDB : réindexation des index Full-TextDans mon projet de création de moteur de recherche, j’ai besoin d’utiliser les index Full-Text qui doivent être quotidiennement réindexés pour intégrer les mots contenus dans les colonnes des nouveaux enregistrements.

Ma table link

Cette table link contient tous les liens que je suis amené à indexer. Elle est composée de l’adresse du lien (url), des ancres (anchor), le title de la page du lien, la date de mise à jour et le code http (httpcode).

CREATE TABLE `link` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`url` VARCHAR(2048) NOT NULL COLLATE 'utf8mb4_general_ci',
	`anchor` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
	`title` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
	`maj` DATETIME NOT NULL DEFAULT current_timestamp(),
	`httpcode` INT(3) NULL DEFAULT NULL,
	PRIMARY KEY (`id`) USING BTREE,
	UNIQUE INDEX `uk_url` (`url`) USING HASH,
	INDEX `ix_httpcode` (`httpcode`) USING BTREE,
	FULLTEXT INDEX `ft_anchor` (`anchor`),
	FULLTEXT INDEX `ft_title` (`title`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=353241
;

Paramètre non dynamique

La vitesse de réindexation est tributaire de la vitesse de votre disque. Un disque SSD pour ce genre d’usage est vivement requis. Mais elle dépend aussi du nombre de cœurs logiques dont dispose votre machine afin de configurer le parallélisme dans le fichier my.ini sur Windows et my.cnf sur Linux. Sur ma machine, je dispose de 16 cœurs logiques.

innodb_ft_sort_pll_degree=16

Procédure d’indexation

Vous devez tout d’abord déterminer le nombre de mots à rechercher et à indexer à l’aide de la directive innodb_ft_num_word_optimize fixée à 2000 par défaut et à 10000 dans l’exemple ci-dessous. Un nombre faible oblige à réindexer plusieurs fois la table.

SET GLOBAL innodb_ft_num_word_optimize=10000;
SET GLOBAL innodb_optimize_fulltext_only=1;
OPTIMIZE TABLE indexing;
OPTIMIZE TABLE link;
SET GLOBAL innodb_optimize_fulltext_only=0;

MariaDB /