Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 13h52   #1
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Par défaut Optimisation d'un serveur mysql (table avec 130 millions de données)

Bonjour,

Actuellement en possession d'une base de données comprenant une table d'environ 20Go(130 millions de records), je cherche un moyen d'optimiser le serveur mysql (ses paramètres mais aussi ceux de l'OS sur lequel il est : Linux (Centos 5)).

Car actuellement une simple requête avec une jointure sur une table de 2Go (10 millions de records) avec un GROUP BY prend 5 minutes.
Les champs de la clause WHERE ont été indexés et la requête et les tables ont été optimisés au maximum.

Je réalise des tests actuellement pour savoir quels seraient les optimisations à faire, mais elle sont longues a tester sur une telle base de données.
Pouvez vous m'indiquer quelles sont les réglages les plus influent sur la rapidité d'exécution d'une requête ?

Si ca continue je vais devoir tester sous d'autres SGBD, comme postgreSQL, pour de meilleurs performances

Merci pour votre aide !
frite333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h15   #2
Membre éclairé
 
Inscription : février 2005
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2005
Messages : 349
Points : 358
Points : 358
bonjour.

De ce que j'ai identifié, les paramètres qui influence le plus les performances sont ceux ci:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# pour agir sur les performances c'est celle la qu'il faut changer
max_connections = 25
key_buffer_size = 128M
max_allowed_packet = 50*1024*1024
table_cache = 1024
sort_buffer_size = 6M
join_buffer_size = 6M
net_buffer_length = 8K
read_buffer_size = 6M
#read_rnd_buffer_size = 1M
#myisam_sort_buffer_size = 224M
query_cache_size = 80M
query_cache_type = 1
query_cache_min_res_unit = 1k
#open_files_limit = 2048
#max_tmp_table = 128
#thread_concurrency = 4
tmp_table_size = 48M
max_heap_table_size = 48M
wait_timeout = 86400
table_open_cache = 600
thread_concurrency = 3
.
NB : ne pas tenir compte des valeurs, les optimiser pour votre utilisation

Je m'aide souvent des script décrit dans ce post pour régler finement le serveur.

Au niveau matériel, ceux qui influe le plus est la rapidité des disques et beaucoup de mémoire vive.

Au niveau de l'OS, je ne connais rien à optimiser. Si vous trouvez ça m'interresse.

Concernant les requetes, il faut bien faire attention car parfois l'optimiseur se perds. Surtout je pense quand beaucoup de champs sont index. Il commence pas forcément par la table ququel on s'attends. Un moyen de controler l'optimiseur est l'utilisation du
__________________
La connaissance s'accroit lorsqu'on la partage.
overider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 10h26   #3
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
C'est a peu près les paramètres que j'avais identifié mais d'autres me sont encore inconnus, je vais étudié cela.

Je vais aussi de ce pas regarder la page de script.

En tout cas merci de ta réponse. Je reposterais ici, si je trouve une quelconque optimisation pour l'OS

A bientôt
frite333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 15h40   #4
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Excusez moi, j'ai une autre question.

J'ai modifier les paramètres du serveur donc je suis passé pour l'exécution de ma requête de 360 secondes à 240 secondes. A partir de là, je ne descend pas plus bas.

Je précise que je teste pour l'instant uniquement UNE seule requête, il n'y a aucune autre connection sur mon serveur pendant ce temps.

J'ai même essayé d'augmenter à un point déraisonnable les valeurs, rien n'y fait.

Comment puis-je réduire le temps d'exécution de cette unique requête juste avec la configuration du serveur ?
frite333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 17h01   #5
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Citation:
Envoyé par frite333 Voir le message
Les champs de la clause WHERE ont été indexés
Et les autres champs qui participent à un order éventuel, ceux des jointures, du group by ?
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 17h07   #6
Membre éclairé
 
Inscription : février 2005
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2005
Messages : 349
Points : 358
Points : 358
il est également possible d'indexer sur deux champs.

Code :
CREATE INDEX index_nom_prenom ON utilisateur (nom,prenom)
Cela peut être plus performants cela depends vraiment de l'utilisation .
__________________
La connaissance s'accroit lorsqu'on la partage.
overider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 17h44   #7
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Je vais peut être dire un truc bête, mais si la situation le permet, c'est à dire si vous pouvez vous permettre d'avoir des données à J+1, pourquoi ne pas créer une table qui regroupe toutes vos colonnes nécessaires, en gros dénormaliser, puis indexer les bonnes colonnes ? Vous mettrez cela à jour chaque nuit.
Une autre idée, ne serait il pas possible de créer une vue qui regroupe ces tables, sur certaines bdd je sais qu'on peut indexer les colonnes d'une vue, ce serait peut être plus rapide.
Sinon, est ce que le faire via une simple procédure stockée n'améliore pas un peu le temps.
Bon courage
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 10h37   #8
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Merci pour vos réponses !

Tout d'abord, au niveau des index tout a été fait, dans les requêtes ainsi que dans les sous requêtes et bien sur aussi sur plusieurs champs.

@patic : Ta solution n'est pas réalisable. Par contre les vues et les procédures stockés ont déjà été testés mais n'améliorent pas du tout le temps d'exécution sur une telle masse de données.

Je reprécise par ailleurs que je recherche plutôt une solution au niveau de la configuration du serveur (et de l'OS si c'est possible).

Pour l'instant grâce à la configuration j'ai pu atteindre une amélioration globale de mes requête de 20% sur le temps d'exécution.
Je crois comprendre que lors du traitement des requêtes, la création de tables temporaire ne peut se faire en mémoire (dû à la taille des tables concernés) et se fait donc sur le disque.
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 5 |
| Created_tmp_tables | 7 |
Cependant ces données issus d'un SHOW STATUS après 3 requêtes identiques montrent qu'il n'a pas fait de tables temporaires sur le disque mais par contre à créé des fichiers temporaires (es ce qu'ils contiennent des tables temporaires ?).
Si c'est le cas, alors le temps d'exécution est dû à la rapidité de lecture/écriture du disque dur ? Et simplement cela ?

Que ce soit le cas ou non, connaissez-vous une méthode/technique/astuce pour optimiser le traitement de mes requêtes ?

Je vous remercie d'avance, pour toute l'aide que vous m'apportez.
frite333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 13h06   #9
Candidat au titre de Membre du Club
 
Homme
Développeur J2EE
Inscription : octobre 2007
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur J2EE

Informations forums :
Inscription : octobre 2007
Messages : 10
Points : 11
Points : 11
Bonjour,

ta question est encore trop vague. Il nous faudrait savoir :
- la version du serveur Mysql utilisé
- le SHOW CREATE TABLE de ta table
- un exemple de requete très lente.

En ce qui concerne le fichier my.cnf cité en exemple :
- le key_buffer_size est trop petit, il ne faut pas hésiter a réserver 1/3 de la RAM pour celui-ci
- le innodb_buffer_pool_size joue le même rôle que key_buffer_size mais pour les tables innodb. Ne pas hésiter à lui réserver beaucoup de mémoire.
ddoumeche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 14h05   #10
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Citation:
Envoyé par frite333 Voir le message
Si ca continue je vais devoir tester sous d'autres SGBD, comme postgreSQL, pour de meilleurs performances
Dans votre cas et compte tenu que vous faites des requêtes d'agrégation, si vous voulez des performances il faut un SGBDR qui sache faire des vues indexées.
Seules solutions : Oracle (mais les vues matérialisées sont asynchrone et le serveur est cher) ou MS SQL Server (vues indexées synchrones).
Pour démo, voir l'étude que j'ai mené sur l'amélioration d'une requête portant sur 1 250 000 lignes, faisant passé le temps de réponse que quelques seconds à non mesurables....
http://sqlpro.developpez.com/optimisation/indexation/

Enfin sur les performances de MySQL, ce SGBD (pseudo relationnel) n'a jamais été conçu pour les performances.... contrairement à une légende...
Lisez les articles que j'ai écrit à ce sujet :
MySQL un ersatz de SGBDR : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/
Benchmark SQL Server / PostGreSQL / MySQL : http://blog.developpez.com/sqlpro/p9...lles-en-sql-1/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 11h51   #11
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Encore une fois merci pour vos réponses

@ddoumeche
Encore une fois ma question ne porte ni la structure des tables, ni la requête.
Au niveau du key_buffer_size, vous avez raison et je pense que le mien est bien réglé.

@SQLpro
Je pense que c'est exactement la réponse que j'attendais. Le problème c'est qu'il est difficilement réalisable dans le cas présent d'envisager un changement de SGBD.
Quoi qu'il en soit, je pense être arrivé au maximum des possibilités de MySQL et au bout de ma question. Je passe mon post en résolu.
Je vais donc lire votre étude, et faire mes propres test.

Je vous remercie tous pour votre aide. A bientôt !
frite333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 14h56   #12
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Vous y gagnerez peut être un peu avec une mise à jour de mysql vers la dernière version (5.6) ... Je ne pense pas que cela impactera beaucoup vos développements en cours.
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 16h21   #13
Invité de passage
 
Homme
Étudiant
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 1
Points : 1
Je ne pense pas que ce sera influant.
Certaines des plus grosses requêtes prennent plusieurs heures, je ne pense pas qu'un mise a jour de mysql permettrait une grande amélioration du temps de traitement :s
frite333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2011, 04h19   #14
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
Salut,

Une solution, peut-être, est de voir si tu peux scinder tes données grâce à un système de hash et donc te retrouver à brasser des tables plus petites... diviser pour mieux règner
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h53.


 
 
 
 
Partenaires

Hébergement Web