Recherche en texte intégral sur InnoDB à l'aide de MyISAM et de procédures stockées
Trouver un moyen rapide et efficace d'effectuer des recherches en texte intégral sur une table InnoDB peut être un défi. Bien que des outils comme Sphinx fournissent une solution, cet article explore une approche MySQL pure utilisant MyISAM et des procédures stockées.
Le défi
Une requête simple qui recherche plusieurs chaînes dans une ligne utilisant des instructions LIKE peut être problématique en raison de ses performances lentes et de ses limitations.
SELECT ... WHERE row LIKE '%some%' OR row LIKE '%search%' OR row LIKE '%string%'
Le Solution
La solution proposée consiste à créer une table de texte intégral MyISAM qui s'indexe dans les tables InnoDB. Cela permet d'indexer une colonne spécifique (par exemple, un sujet) qui nécessite une recherche.
Structure de la base de données
Les tables InnoDB sont définies pour les données principales, telles que les utilisateurs et threads.
create table users (...) engine=innodb; create table forums (...) engine=innodb; create table threads ( ... subject varchar(255) not null, -- column we want to search ... ) engine=innodb;
La table de texte intégral MyISAM (par exemple, threads_ft) fournit la recherche index.
create table threads_ft ( ... subject varchar(255) not null, fulltext (subject), -- fulltext index on subject ... ) engine=myisam;
Procédure stockée
La procédure stockée (par exemple, ft_search_threads) accepte le terme de recherche en entrée et effectue la recherche à l'aide de l'index de texte intégral MyISAM. Il joint ensuite les résultats aux tables InnoDB pour récupérer les données nécessaires.
create procedure ft_search_threads ( in p_search varchar(255) ) begin ... select t.*, ... from threads_ft tft ... match(tft.subject) against (p_search in boolean mode) ... order by rank desc ... end;
Exemple d'utilisation
La procédure stockée peut être appelée depuis une application PHP ou un outil de ligne de commande :
call ft_search_threads('+innodb +clustered +index');
Cet exemple renvoie les 100 premiers résultats de la table des threads qui correspondent au terme de recherche "innodb index clusterisé."
En utilisant cette approche, vous pouvez obtenir une fonctionnalité de recherche de type texte intégral sur les tables InnoDB sans compromettre les performances. Il s'agit de créer une table MyISAM dédiée à l'indexation et d'écrire une procédure stockée pour effectuer la recherche et la récupération des données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!