REGEXP ou WHERE

dudo
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 456
Inscription: 10 Jan 2004

REGEXP ou WHERE

Message le Mer Juil 19, 2006 13:09

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


Xou
WRInaute discret
WRInaute discret
 
Messages: 187
Inscription: 2 Juin 2006

Message le Mer Juil 19, 2006 13:33

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.


siddhy
WRInaute discret
WRInaute discret
 
Messages: 163
Inscription: 20 Sep 2004

Message le Mer Juil 19, 2006 13:35

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 ?


Borower
WRInaute passionné
WRInaute passionné
 
Messages: 2151
Inscription: 18 Avr 2005

Message le Mer Juil 19, 2006 14:09

Pour moi le REGEXP est plus rapide a ecrire :roll: donc je prefere utiliser REGEXP

dudo
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 456
Inscription: 10 Jan 2004

REGEXP meilleur

Message le Mer Juil 19, 2006 14:38

siddhy a écrit: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

jarreweb
WRInaute discret
WRInaute discret
 
Messages: 192
Inscription: 12 Sep 2003

Message le Mer Juil 19, 2006 15:37

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


siddhy
WRInaute discret
WRInaute discret
 
Messages: 163
Inscription: 20 Sep 2004

Message le Mer Juil 19, 2006 15:37

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..?..

dudo
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 456
Inscription: 10 Jan 2004

REGEXP

Message le Mer Juil 19, 2006 16:06

siddhy a écrit: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


siddhy
WRInaute discret
WRInaute discret
 
Messages: 163
Inscription: 20 Sep 2004

Message le Mer Juil 19, 2006 16:15

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...


Xou
WRInaute discret
WRInaute discret
 
Messages: 187
Inscription: 2 Juin 2006

Message le Mer Juil 19, 2006 17:29

Test effectué sur la base de donnée insee des communes de france (38949 enregistrements):

Code: Tout sélectionner
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: Tout sélectionner
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 !

spidetra
WRInaute passionné
WRInaute passionné
 
Messages: 1500
Inscription: 7 Juil 2003

Message le Mer Juil 19, 2006 21:42

...
Dernière édition par spidetra le Ven Aoû 04, 2006 13:14, édité 1 fois.


Xou
WRInaute discret
WRInaute discret
 
Messages: 187
Inscription: 2 Juin 2006

Message le Jeu Juil 20, 2006 8:45

Effectivement on gagne un peu, même si le champ n'est pas indexé:

Code: Tout sélectionner
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: Tout sélectionner
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.)


siddhy
WRInaute discret
WRInaute discret
 
Messages: 163
Inscription: 20 Sep 2004

Message le Jeu Juil 20, 2006 9:22

si tu vires les 2 %, tu peux remplacer LIKE par = ...

spidetra
WRInaute passionné
WRInaute passionné
 
Messages: 1500
Inscription: 7 Juil 2003

Message le Jeu Juil 20, 2006 16:54

...
Dernière édition par spidetra le Ven Aoû 04, 2006 13:14, édité 1 fois.


Pandore
WRInaute passionné
WRInaute passionné
 
Messages: 1441
Inscription: 14 Oct 2005

Message le Jeu Juil 20, 2006 17:17

Très intéressant tout ça mais juste une question en passant : comment vous faites pour savoir le temps de traitement ???

REGEXP ou WHERE

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités