Non, c'est à peu près ce qu'ils font. Maintenant, s'il n'y a pas de caractère générique de début et que le champ est indexé, ce qui est la situation habituelle, le moteur de base de données peut appliquer l'expression régulière à l'index. Ainsi, par exemple, si vous écrivez
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
la base de données peut utiliser l'index sur LAST_NAME
pour trouver toutes les lignes où le nom de famille commence par «Cav». D'un autre côté, si vous aviez quelque chose comme
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
la base de données devrait analyser la table entière (ou l'index entier) et évaluer l'expression par rapport à la LAST_NAME
valeur complète . Évidemment, c'est très cher.
La plupart des meilleures bases de données relationnelles disposent d'installations pour effectuer une recherche en texte intégral d'une manière plus efficace en construisant différents types d'index et de catalogues de texte, mais ceux-ci n'utilisent pas le mot clé LIKE. Par exemple, voici un bel article qui traite de la recherche en texte intégral dans PostgreSQL .
LAST_NAME
être candidat à (la première colonne de) l'index clusterisé? pps dans quelle mesure cette réponse suppose-t-elle que le système de base de données est basé sur un stockage contigu sur disque et sur des index B-tree?En plus de ce que Justin Cave a écrit, depuis PostgreSQL 9.1, vous pouvez accélérer toute recherche avec
LIKE
(~~
) ouILIKE
(~~*
), ainsi que les correspondances d'expressions régulières de base (~
). Utilisez les classes d'opérateurs fournies par le module pg_trgm avec un index GIN ou GiST pour accélérer lesLIKE
expressions qui ne sont pas ancrées à gauche. Pour installer l'extension, exécutez une fois par base de données:Créer un index du formulaire
Ou:
La création et la maintenance d'un index GIN ou GiST ont un coût, mais si votre table n'est pas fortement écrite, c'est une excellente fonctionnalité pour vous.
Depesz a écrit un excellent article dans son blog sur la nouvelle fonctionnalité.
GIN ou GiST?
Ces deux citations du manuel devraient fournir quelques conseils
Mais pour les requêtes de type "plus proche voisin" avec l'opérateur utilisant la distance
<->
:la source
En parlant de MySQL, la position du caractère générique (%) fait une différence. Si la première partie du texte est spécifiée comme
where first_name like 'Sta%'
, alors le moteur de base de données recherchera seulement un plus petit sous-ensemble de mots commençant par S, puis allant à St, puis Sta, etc. Si vous faites quelque chose commewhere first_name like '%stan%'
, alors et l'analyse complète du sera requise. Vous pouvez également consulter des index de texte intégral qui effectuent également des recherches en langage naturel. Consultez les documents MySQL ici.la source