Question

Quelqu'un sait-il quelle est la complexité de l'opérateur LIKE SQL pour les bases de données les plus courantes?

Était-ce utile?

La solution

Examinons les trois affaires principales séparément. Cette discussion est spécifique à MySQL, mais peut également s’appliquer à d’autres SGBD, car les index sont généralement implémentés de la même manière.

LIKE 'foo%' est rapide s'il est exécuté sur une colonne indexée. Les index MySQL sont une variante des arbres B. Par conséquent, lors de l'exécution de cette requête, ils peuvent simplement descendre l'arborescence jusqu'au nœud correspondant à foo , ou au premier nœud avec ce préfixe, puis parcourez l'arborescence en avant. Tout cela est très efficace.

LIKE '% foo' ne peut pas être accéléré par les index et donnera lieu à un balayage complet de la table. Si vous avez d'autres critères qui peuvent être exécutés à l'aide d'index, il ne scanne que les lignes qui restent après le filtrage initial.

Il existe cependant une astuce : par exemple, si vous souhaitez rechercher un suffixe - rechercher des noms de fichiers avec l'extension .foo , vous pouvez obtenir les mêmes performances en ajoutant une colonne avec le même contenu que celle d'origine mais avec les caractères dans l'ordre inverse.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);

La recherche de lignes avec col se terminant par .foo devient alors:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

Enfin, il y a LIKE '% foo%' , pour lequel il n'y a pas de raccourcis. S'il n'y a pas d'autres critères limitants permettant de réduire le nombre de lignes à une valeur possible nombre, cela va causer un coup dur à la performance. Vous voudrez peut-être envisager une solution de recherche en texte intégral ou une autre solution spécialisée.

Autres conseils

Si vous vous interrogez sur l'impact sur les performances:

Le problème de like est qu'il empêche la base de données d'utiliser un index. Sur Oracle, je pense qu’il n’utilise plus les index (mais je suis toujours sur Oracle 9). SqlServer utilise des index si le caractère générique est seulement à la fin. Je ne connais pas d'autres bases de données.

Dépend du SGBDR, des données (et éventuellement de la taille des données), des index et de la manière dont LIKE est utilisé (avec ou sans caractère générique de préfixe)!

Vous posez une question trop générale.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top