perf mysql : ne pas surcharger les recherches
Quand il y a un espace dans l'expression recherchée avec le formulaire_recherche, une regexp est générée.
Cette regexp teste la présence
- de l'un au moins des termes pris séparément
- de l'expression entière
Ça donne une expression assez lourde et un log du genre :
`
Query_time: 5.534722 Lock_time: 0.000156 Rows_sent: 69 Rows_examined: 12799
SELECT t.id_truc, t.titre, t.texte, t.texte_original, t.contact_email, t.contact_cp, t.geo_code_postal, t.contact_ville, t.geo_ville, t.geo_departement, t.geo_pays, t.adresse_resumee
FROM paeco
.spip_trucs AS t
WHERE t.id_truc REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.titre REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.texte_revue REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.texte_original REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.contact_email REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.contact_cp REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.geo_code_postal REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.contact_ville REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.geo_ville REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.geo_departement REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.geo_pays REGEXP 'Brigitte Machin|Brigitte|Machin' OR t.adresse_revue REGEXP 'Brigitte Machin|Brigitte|Machin';
`
Or, s'il suffit que l'un des terme pris séparément soit trouvé, il ne sert à rien de tester l'expression complète.
Si la majorité des expressions proposées avec espace est composée de 2 ou 3 mots seulements, ça allégera significativement la recherche, sans altérer aucunement les résultats.
Dans l'exemple, la requête devient :
SELECT t.id_truc, t.titre, t.texte, t.texte_original, t.contact_email, t.contact_cp, t.geo_code_postal, t.contact_ville, t.geo_ville, t.geo_departement, t.geo_pays, t.adresse_resumee FROM
paeco.spip_trucs AS t WHERE t.id_truc REGEXP 'Brigitte|Machin' OR t.titre REGEXP 'Brigitte|Machin' OR t.texte_revue REGEXP 'Brigitte|Machin' OR t.texte_original REGEXP 'Brigitte|Machin' OR t.contact_email REGEXP 'Brigitte|Machin' OR t.contact_cp REGEXP 'Brigitte|Machin' OR t.geo_code_postal REGEXP 'Brigitte|Machin' OR t.contact_ville REGEXP 'Brigitte|Machin' OR t.geo_ville REGEXP 'Brigitte|Machin' OR t.geo_departement REGEXP 'Brigitte|Machin' OR t.geo_pays REGEXP 'Brigitte|Machin' OR t.adresse_revue REGEXP 'Brigitte|Machin';
Mes tests dans la console de phpmyadmin confirment un meilleur temps de réponse et des résultats identiques.