web-dev-qa-db-fra.com

Comment est comme implémenté?

Quelqu'un peut-il expliquer comment l'opérateur similaire est mis en œuvre dans les systèmes de base de données actuels (par exemple MySQL ou Postgres)? Ou dirigez-vous de références qui expliquent-elles?

L'approche naïve serait d'inspecter chaque enregistrement, d'exécuter une expression régulière ou une correspondance de chaîne partielle sur le domaine de l'intérêt, mais j'ai un sentiment (espoir) que ces systèmes font quelque chose de plus intelligent.

23
Nick

Non, c'est à peu près ce qu'ils font. Maintenant, s'il n'y a pas de grand caractère générique et que le champ est indexé, qui est la situation habituelle, le moteur de base de données peut appliquer l'expression régulière à l'index. Donc, 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 "CAV". D'autre part, si vous aviez quelque chose comme

SELECT *
  FROM employees
 WHERE last_name LIKE '%av%'

la base de données devra numériser toute la table (ou l'index entier) et évaluer l'expression contre la totalité LAST_NAME valeur. Évidemment, c'est très cher.

La plupart des bonnes bases de données relationnelles ont des installations pour effectuer une recherche de texte intégral de manière plus efficace en construisant différentes sortes d'index et de catalogues de texte, mais ceux-ci n'utilisent pas le mot clé comme. Par exemple, voici un bel article qui discute recherche en texte intégral dans PostgreSQL .

19
Justin Cave

En plus de ce que Justin Cave a écrit, depuis PostgreSQL 9.1 Vous pouvez accélérer up tout Recherche avec LIKE (~~) ou ILIKE (~~*), et des allumettes d'expression régulières de base aussi (~). Utilisez les classes de l'opérateur fournies par le module pg_trgm avec un index gin ou gist pour accélérer les expressions LIKE expressions qui ne sont pas à gauche-ancrated. Pour installer l'extension, exécutez une fois par base de données:

CREATE EXTENSION pg_trgm;

Créer un index du formulaire

CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops);

Ou alors:

CREATE INDEX tbl_col_Gist_trgm_idx ON tbl USING Gist (col Gist_trgm_ops);

Création et maintenance d'un Gin ou index Gist Porte un coût, mais si votre table n'est pas très é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 des indications

Le choix entre l'indexation GIST et GIN dépend des caractéristiques de performance relatives de GIST et de GIN, qui sont discutées ailleurs. En règle générale, un indice de gin est plus rapide de rechercher qu'un indice de gist, mais plus lentement à construire ou à mettre à jour; Donc, Gin est mieux adapté aux données statiques et gist pour des données souvent mises à jour.

Mais pour le type de "voisin le plus proche" de requêtes avec l'utilisation de l'opérateur de distance <->:

Cela peut être mis en œuvre assez efficacement par des index gisés, mais pas par les index GIN.

28
Erwin Brandstetter

Parlant de MySQL, la position du caractère de carte sauvage (%) fait une différence. Si la première partie du texte est spécifiée comme where first_name like 'Sta%', alors le moteur DB ne recherchera qu'un seul sous-ensemble de mots qui fixera S, puis allant à ST, puis STA, etc. Si vous faites quelque chose comme where first_name like '%stan%', alors et que toute la numérisation de la colonne sera requise. Vous pouvez également consulter des index de texte intégral qui effectuent également des recherches sur la langue naturelle. Découvrez les documents MySQL ici.

5
StanleyJohns