Salut Edgy13.
L'analyse d'Escartefigue est tout à fait pertinente, mais en regardant de plus votre message, il y a, a priori, des problèmes de conceptions de votre base de données.
1) pourquoi mettre dans la même et de surcroit dans la base de données des noms de colonnes très similaire : clientid & id_client.
Cela va porter à confusion et donc source d'erreur.
2) vous avez créé un identifiant client (panachage de chiffres et de lettres) qui n'apporte rien sinon que des complications.
Le mieux aurait été de définir cette colonne avec le type "integer", voire "bigint".
3) je ne sais pas ce que signifie ce panachage de chiffres et de lettres, mais comme vous faites une recherche dessus, le mieux aurait été de créer une table de catégorie.
Cette table catégorie aurait une clef étrangère qui pointe sur la table des clients.
4) qu'est-ce que ce ce schmilblick :
AND _t.id_client NOT REGEXP '^[a-hj-zA-HJ-Z]'
qui ne sert à rien sinon à rendre votre requête inintelligible ?
Vous vérifier que le premier caractère de votre colonne "id_client", est soit un "i" minuscule ou majuscule ou soit un chiffre ou autre chose.
Si vous avez besoin de récupérer l'identifiant commençant par un "i", on fait :
AND _t.id_client like 'i'
De plus, vous avez besoin de ne pas faire de distinction entre les majuscules et les minuscules.
En principe, en français, on utilise le collate "latin1_general_ci" ou "utf8_general_ci", car CI signifie insensible à la casse.
5) cette recherche sur les email, ne sert à rien.
1 2
| AND _t.email LIKE '%@%'
AND _t.email REGEXP '^[a-zA-Z0-9][+a-zA-Z0-9._-]*@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]*\\.[a-zA-Z]{2,4}$' |
La colonne email est une information et ne peut pas servir à faire des recherches.
Si c'est pour vérifier la syntaxe de l'adresse email, cela se fait au moment de la saisie de celle-ci pas après.
6) que signifie :
AND _b.event_day > '2012-10-01'
Désirez vous récupérer que les dates du mois de octobre de l'année 2012 ?
Dans ce cas là, je vous conseille de partitionner vos tables.
Le fait d'interroger une partition, vous permet de récupérer que les extractions de cette partition.
Si c'est pour récupérer toutes les lignes allant d'octobre 2012 jusqu'à aujourd'hui, votre test devra balayer toutes les lignes de la tables et donc vos index ne servent à rien.
Il faudrait plus d'explication sur l'usage de cette date afin de mieux comprendre ce que vous cherchez à sélectionner.
7) rien de particulier à dire sur les jointures.
8) il reste alors ceci :
1 2 3
| WHERE (_b.statut = 'gin'
OR _b.statut = 'ggr'
OR _b.statut = 'din') |
Le mieux serait de faire un union comme ceci :
1 2 3
| select ... from table_1 where col1 = val_1 union
select ... from table_1 where col1 = val_2 union
select ... from table_1 where col1 = val_3 |
Mais la recherche sera trois fois plus lente qu'une seule extraction.
En gros, vous devez revoir complètement la structure de votre base de données afin d'améliorer considérablement votre requête.
Vos index, ne servent à rien !
@+
Partager