REGEXP ou WHERE

WRInaute impliqué
bonjour,

Je pose comme constat que
LIKE est 2 à 4 fois plus lent que REGEXP
vous pouvez le vérifier

donc interroger une table de cette maniere
WHERE (titre) REGEXP ('toto|titi|tutu')
est plus court que :
WHERE titre LIKE '%toto%' OR titre LIKE '%titi%' OR titre LIKE '%tutu%'


Maintenant, je souhaite votre avis plus rapide certe, mais est ce plus gourmand en ressouces ? donc est ce une bonne optimisation ?

Merci pour votre avis

ludo
 
WRInaute discret
Je vais peut-être m'avancer un peu vite... je n'ai aucune certitude à dire cela, mais je parts toujours du principe que si la méthode se révèle plus rapide c'est forcemment la bonne car ça libère plus rapidement les les ressources pour les autres utilisateurs.
 
WRInaute discret
Salut,

Je viens de tester les 2 manières, et pour moi le LIKE est plus rapide que le REGEXP...
WHERE (`nom_residence`) REGEXP ('dom|kang|blanc') => (5 total, traitement: 0.0338 sec.)
WHERE `nom_residence` LIKE ('%dom%') OR `nom_residence` LIKE ('%kang%')OR `nom_residence` LIKE ('%blanc%') => (5 total, traitement: 0.0051 sec.)

Quelqu'un aurait il d'autres résultats ?
 
WRInaute impliqué
REGEXP meilleur

siddhy a dit:
Salut,

Je viens de tester les 2 manières, et pour moi le LIKE est plus rapide que le REGEXP...
WHERE (`nom_residence`) REGEXP ('dom|kang|blanc') => (5 total, traitement: 0.0338 sec.)
WHERE `nom_residence` LIKE ('%dom%') OR `nom_residence` LIKE ('%kang%')OR `nom_residence` LIKE ('%blanc%') => (5 total, traitement: 0.0051 sec.)

Quelqu'un aurait il d'autres résultats ?

Re,
Cela dit Le temps de traitement depend de plusieurs parametres:

Pour moi REGEXP est un peu + rapide avec une BDD de 15000
et des departements 18 ("44|49|53|72|76|85|27|14|50|61..)

0,490 contre 0,540 pondere sur 7 tests consécutifs

Mais j'ai vu mieux beaucoup mieux, cela dit c'est aussi + facile à écrire,
reste les ressources utilisées.

D'autres tests SVP seraient utiles

ludo
 
WRInaute discret
essayez de voir si il n'y a pas de possibilité d'utiliser des index au lieu de LIKE ou REGEXP
la vitesse de traitement est fulgurante.
dans ma profession, je manipule des tables avec plusieurs centaines de milliers d'entrées et les requêtes se font en à peine en à peine 0.0500 sec. (ce qui pour certains est déjà beaucoup)plus d'infos sur http://dev.mysql.com/doc/refman/5.0/fr/ ... dexes.html
 
WRInaute discret
Je viens de refaire des tests sur une autre BDD + importante (table avec 12 000 enregistrements ) en plain text :
REGEXP => (419 total, traitement: 0.0807 sec.)
LIKE => (419 total, traitement: 0.0118 sec.)
et j'ai rechargé plusieurs fois...

Peut être que sur des champs text LIKE est + rapide et sur des champs numériques, c'est REGEXP qui est plus rapide..?..
 
WRInaute impliqué
REGEXP

siddhy a dit:
Je viens de refaire des tests sur une autre BDD + importante (table avec 12 000 enregistrements ) en plain text :
REGEXP => (419 total, traitement: 0.0807 sec.)
LIKE => (419 total, traitement: 0.0118 sec.)
et j'ai rechargé plusieurs fois...

Peut être que sur des champs text LIKE est + rapide et sur des champs numériques, c'est REGEXP qui est plus rapide..?..


Re
Tout à fait la requête elle même, le type et le nombre de champs
sur lequel porte la requete, ton resultat à 0,0 est bon pour 12000 il porte sur combien de champs ?
Par ailleurs, en terme de test je pense à un client mySQL donnant
les temps à chaque commande.
Pou repondre à jarreweb, utiliser where et REGEXP ou pas mais avec index bien sûr dans tous les cas c'est preferable.

debat reste oouvert

ludo
 
WRInaute discret
Ici j'ai fait une requete sur 2 champs texte avec 3 possibilités dans le REGEXP..
D'accords pour les INDEX.. sauf pour des champs TEXT...
 
WRInaute discret
Test effectué sur la base de donnée insee des communes de france (38949 enregistrements):

Code:
SELECT * FROM `communes` where `cp` like ('%28210%') OR `cp` like ('%28250%') OR `cp` like ('%33000%') OR `cp` like ('%72000%') OR `cp` like ('%37000%') OR `cp` like ('%28000%') OR `cp` like ('%75015%') OR `cp` like ('%06000%');
(33 total, traitement: 0.0335 sec.)

Code:
SELECT * FROM `communes` where (`cp`) REGEXP ('28210|28250|33000|72000|37000|28000|75015|06000');
(33 total, traitement: 0.1358 sec.)


Comme le dit siddhy, y'a pas photo !
 
WRInaute discret
Effectivement on gagne un peu, même si le champ n'est pas indexé:

Code:
SELECT * FROM `communes` where `cp` like ('28210%') OR `cp` like ('28250%') OR `cp` like ('33000%') OR `cp` like ('72000%') OR `cp` like ('37000%') OR `cp` like ('28000%') OR `cp` like ('75015%') OR `cp` like ('06000%')
(33 total, traitement: 0.0299 sec.) contre (33 total, traitement: 0.0335 sec.) avec 2 modulos


par contre en virant le modulo on perd:
Code:
SELECT * FROM `communes` where `cp` like ('28210') OR `cp` like ('28250') OR `cp` like ('33000') OR `cp` like ('72000') OR `cp` like ('37000') OR `cp` like ('28000') OR `cp` like ('75015') OR `cp` like ('06000')
(33 total, traitement: 0.0428 sec.)
 
WRInaute passionné
Très intéressant tout ça mais juste une question en passant : comment vous faites pour savoir le temps de traitement ???
 
WRInaute accro
PHPMyAdmin indique le temps pour la requête effectuée sur l'interface.

edit: oups, décidemment aujourd'hui je suis à la traine..
 
WRInaute discret
spidetra a dit:
1. Remplace * dans ton SELECT par la liste des champs dont tu as besoin, surtout si tu as bc de champs dans ta table.
2. Tes LIKE ne servent plus a rien dans ta nouvelle syntaxe
For sure, c'était juste pour lui donner à manger ! ;)

spidetra a dit:
2. Tes LIKE ne servent plus a rien dans ta nouvelle syntaxe
C'était juste pour l'exemple, mais il va de soit que IN est beaucoup plus efficace et surtout plus approprié aux champs numériques.
Code:
SELECT * FROM `communes` WHERE `cp` IN ('28210', '28250', '33000', '72000', '37000', '28000', '75015', '06000')
(33 total, traitement: 0.0192 sec.)
 
Discussions similaires
Haut