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 :
Code :
- [mysqld]
- character-set-server = latin1
- init-connect ='SET NAMES latin1'
- default-character-set = latin1
- user = mysql
- port = 3306
- socket = /var/run/mysqld/mysqld.sock
- pid-file = /var/run/mysqld/mysqld.pid
- log-error = /var/log/mysql/mysqld.err
- basedir = /usr
- datadir = /var/lib/mysql
- skip-locking
- key_buffer = 128M
- max_allowed_packet = 16M
- table_cache = 512
- sort_buffer_size = 8M
- net_buffer_length = 8K
- read_buffer_size = 1M
- read_rnd_buffer_size = 512K
- myisam_sort_buffer_size = 8M
- language = /usr/share/mysql/english
- query_cache_size = 64M
- query_cache_limit = 1M
- max_connections = 50
- join_buffer_size = 1M
- thread_cache_size = 64
- tmp_table_size = 64M
- max_heap_table_size = 64M
|
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.