Ce qui est plus rapide — INSTR ou COMME?
Si votre objectif est de tester si une chaîne de caractères existe dans une base de données MySQL colonne (de type "varchar", 'texte', 'blob', etc) - ce qui est le plus rapide /plus efficace /mieux à utiliser, et pourquoi?
Ou, est-il une autre méthode que les sommets de l'un de ces?
INSTR( columnname, 'mystring' ) > 0
vs
columnname LIKE '%mystring%'
- Permettant une recherche fulltext index peut être plus rapide si votre texte chaînes sont longues
column regexp 'mystring'
est généralement plus rapide que de celle de l'- Votre question a au moins
5
votes pour le comme opérateur de la balise. Pourrais-je vous prie de bien vouloir suggérer sql en tant que synonyme? - comme une alternative de tout ci-dessous
REGEXP
vous pouvez également essayer dePOSITION ('mystring' in columnname) > 0
Vous devez vous connecter pour publier un commentaire.
FULLTEXT recherches sont absolument va être plus rapide, comme kibibu noté dans les commentaires ci-dessus.
Cependant:
Dans mes tests, ils fonctionnent exactement de la même. Ils sont insensibles à la casse, et en général ils effectuent plein les analyses de la table, un no-no lorsque vous traitez avec des hautes performances de MySQL.
Sauf si vous faites une recherche par préfixe sur une colonne indexée:
Dans ce cas, la COMME avec seulement un suffixe générique est beaucoup plus rapide.
Dans le cas d'un "front wilcard" (c'est à dire un "LIKE '%...'" prédicat), comme cela semble être le cas ici, INSTR et COMME doit effectuer à peu près la même.
Lorsque le générique est pas d'un "front générique", l'approche devrait être plus rapide, à moins que le générique n'est pas très sélectif.
La raison pourquoi le type de générique et de sa sélectivité question est qu'un prédicat avec INSTR() va systématiquement résultat dans un tableau d'analyse (SQL ne peut pas faire d'hypothèses sur la sémantique de l'INSTRUMENT), lequel SQL peut tirer parti de sa compréhension de la sémantique du prédicat LIKE peut-être utiliser un index pour l'aider à tester un ensemble réduit de correspondances possibles.
Comme suggéré dans les commentaires sous la question elle-même, un index de Texte Intégral sera beaucoup plus rapide. La différence dépend de la distribution des mots dans le texte, et aussi la taille globale de la table, etc. mais rien attendre de deux fois plus rapide pour peut-être 10 fois plus rapide.
L'inconvénient de l'utilisation à d'index de texte intégral, en plus des frais généraux pour la création d'un tel indice, est que si l'on est très prudent dans la configuration de cet indice (ex: définition de l'arrêt de la liste de mots, l'utilisation de la syntaxe de recherche afin d'éviter les formes et les tiens...), il peut y avoir des cas où les résultats fournis par FullText ne sera pas comme prévu. Par exemple, la recherche d'un "VU" (un outil pour couper du bois), on peut obtenir beaucoup de succès pour les dossiers, y compris le verbe "voir", dans ses diverses formes conjuguées.
Bien sûr, ces linguistiques-connaissance des caractéristiques de la fulltext index peuvent généralement être remplacée et aussi on peut considérer que ces éléments sont effectivement un avantage, pas un inconvénient. Je viens de le mentionner ici, car nous sommes de les comparer à une simple recherche de génériques.
MySQL - INSTR vs RECHERCHEZ vs COMME vs REGEXP
Pour moi le INSTR et RECHERCHEZ effectué de la manière la plus rapide:
LIKE 'foo%'
sera plus rapide queINSTR
.Il y a peu à ajouter à razzed du test. Mais apparemment, à l'aide de
regexp
ne encourir une plus lourde charge de traitement, contrairement à ce Seth le souligne dans son commentaire.Les tests suivants supposons que vous définissez
query_caching
àOn
dans mon.iniTests
Les horaires indiquent la moyenne des performances, des trois mesures (avec le cache effacé par intermittence):
COMME
Initiale: 0.0035 s
Mise en cache: 0.0005 s
REGEXP
Initiale: 0,01 s
Mise en cache: 0.0004 s
Résultat
LIKE
ouINSTR
est nettement plus rapide queREGEXP
.Même minimes, le cache de la différence de temps est probablement suffisante pour justifier une enquête plus approfondie.
Probablement configuré MySQL système, le contenu des fichiers d'indexation doit généralement être toujours plus vite, ou au moins à égalité avec un non indexée de recherche. Donc, utiliser l'indexation, en particulier sur les longs langage humain textes, quel que soit intermittente code de balisage.