Laquelle de ces deux requêtes serait la plus performante dans MySQL et / ou ORACLE?
SELECT * FROM User WHERE CONCAT(name, " ", lastname, " ", email) LIKE "%searchTerm%";
ou
SELECT * FROM User WHERE name LIKE "%searchTerm%" OR lastname LIKE "%searchTerm%" OR email LIKE "%searchTerm%";
J'ai un fort ressentant le second, mais j'aimerais en être sûr.
3 Réponses :
SELECT * FROM User WHERE CONCAT(name, " ", lastname, " ", email) LIKE "%searchTerm%";
Tout d'abord, les deux requêtes ne sont pas équivalentes . Dans le cas où un espace (le délimiteur de concaténation) peut être utilisé dans le searchTerm , la première requête peut ne pas correspondre, mais la seconde le peut, car la correspondance s'étend sur deux ou trois colonnes.
Les performances seront être identique car les deux requêtes effectuent une analyse complète de la table et la différence réside uniquement dans la condition de filtre
Première requête
1 - filter("NAME"||' '||"LASTNAME"||' '||"EMAIL" LIKE '%searchTerm%')
Deuxième requête
1 - filter("NAME" IS NOT NULL AND "NAME" IS NOT NULL AND "NAME" LIKE '%searchTerm%' OR "LASTNAME" IS NOT NULL AND "LASTNAME" IS NOT NULL AND "LASTNAME" LIKE '%searchTerm%' OR "EMAIL" IS NOT NULL AND "EMAIL" IS NOT NULL AND "EMAIL" LIKE '%searchTerm%')
Donc, en gros, aucune des requêtes ne convient pour une recherche client sur des tables non trival fort>.
Vous souhaitez généralement limiter la recherche à la colonne LIKE 'xxxxxx%'
qui peut utiliser un index.
(Réponse MySQL)
Dans les deux cas, il impliquera une analyse complète de la table, donc aucun ne sera rapide. (La récupération de lignes est plus coûteuse que l'évaluation d'expressions.) De plus, le caractère générique de début implique que la ou les chaînes doivent être entièrement analysées; aucun INDEX
utilisable possible.
Si votre "serachTerm" est toujours mot (s), alors utilisez FULLTEXT (nom, prénom, email)
et MATCH (nom, nom, email) CONTRE ("+ searchTerm" EN MODE BOOLÉEN)
; ce sera beaucoup plus rapide.
Qu'obtenez-vous avec
Explain
?Il est probable que les deux effectuent une analyse complète de la table, il n'y a donc probablement pas beaucoup de différence entre eux. Dans Oracle, vous pouvez créer un index basé sur les fonctions sur des colonnes concaténées, ce qui peut vous permettre d'obtenir une analyse rapide complète de l'index à la place. .
Les exemples n'ont pas de syntaxe valide pour Oracle. Des guillemets simples doivent être utilisés et
CONCAT
a> n'a que deux paramètres et doit être imbriqué ou||
doit être utilisé.