Optimiser requête lourde (Copying to tmp table ?) - SQL/NoSQL - Programmation
Marsh Posté le 20-09-2011 à 08:43:31
Si la requête n'est pas optimisable directement car trop lourdingue, il faut aussi tester en la scindant en requêtes + élémentaires qui iront beaucoup plus vite si l'on s'arrange bien. Faut pas toujours vouloir tout faire d'un seul bloc, car travailler sur X tables différentes à un coût, surtout avec des tris lourds au cul. T'as création d'une ou plusieurs tables temporaires car la base ne peut pas tout faire d'un seul coup et t'as des tris compliqués, elle scinde les opérations du mieux qu'elle peut. On évite autant que possible le recours aux tables temporaires, mais bon parfois on n'a pas vraiment le choix...
Marsh Posté le 20-09-2011 à 10:07:15
Tu peux monter tmp_table_size à 160 Mo et join_buffer_size à 16Mo pour voir...
Marsh Posté le 20-09-2011 à 10:09:35
Si ce genre de requete deviens trop lourde tu peux aussi precalculer un maximum de choses, faire des tables avec des valeurs precalculée et déja jointes.
Marsh Posté le 20-09-2011 à 10:19:32
Hello,
il n'est malheureusement pas possible d'exploser la requête en plusieurs petites : c'est pas utile vu le contexte des tables. De plus, j'ai déjà un cron qui fait un max de choses la nuit pour préparer le terrain.
J'essaierai d'augmenter les valeurs comme le conseille rufo.
En attendant, j'ai réussi à résoudre une bonne partie du problème en installant un index triple. Si jamais au fur et à mesure que les données rentrent je rencontre de nouvelles difficultés, j'en reparlerai de nouveau ici.
Merci à vous
Marsh Posté le 19-09-2011 à 18:32:15
Hello à vous
je suis en ce moment en train de concevoir un outil permettant de générer un tableau de statistiques assez malléable, avec une requête MySQL qui s'adapte en fonction des besoins de l'utilisateur.
La masse de données dans la base est conséquente (comprendre des tables de plusieurs millions de lignes) et en constante expansion. Aussi, je me suis très vite heurté à des problèmes de performances assez drastiques.
Notez qu'il s'agit d'une requête avec plusieurs left / inner join, avec un group by sur deux champs pas nécessairement de la même table, et un order by également sur deux champs pas nécessairement dans la même table.
Donc, j'ai commencé par améliorer mes index, créer des index doubles là où c'était nécessaire / utile... Pas concluant. Optimisation des données de my.cnf à l'aide de tuning primer... je mets les données telles qu'elles sont après optimisation :
Le fait est que ça ne réduit pas. En observant, on se rend compte que la requête reste longtemps en statut "Copying to tmp table". Je suppose que c'est le fait d'écrire la requête sur le DD, non ?
Quoi qu'il en soit, existe-t-il un moyen de se débarrasser de cette étape ? En augmentant un cache, ou autre...
Merci !
---------------
Si ça n'explose pas, vous ne faites pas avancer la science.