Bonjour @ tous
J'ai besoin de votre aide pour optimiser mes requêtes ainsi que mon serveur mysql.
Je suis sous Ubuntu server 8.04.3 LTS et voici une partie de mon my.cnf:
Voici la structure de ma bdd:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 # # * Fine Tuning # key_buffer = 16M max_allowed_packet = 16M thread_stack = 128K thread_cache_size = 8 #max_connections = 100 #table_cache = 64 #thread_concurrency = 10 # # * Query Cache Configuration # query_cache_limit = 1M query_cache_size = 16M
Et voici une requête "type" de mon programme qui est lente sur environ 400 000 articles et 75 000 ordonnances:
Je me retrouve souvent avec des requêtes imbriquées à cause des count(*)...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 SELECT o.*, DATE_FORMAT(o.date_enregistrement,'%H:%i:%s') AS heure, IFNULL(A.nbarticle,0) AS nbarticle, IFNULL(B.nbDelivre,0) AS nbDelivre, IFNULL(C.nbProduit,0) AS nbProduit, IFNULL(D.nbComplete,0) AS nbComplete, p.idgare FROM ordonnance o LEFT OUTER JOIN poste p USING (idposte) LEFT OUTER JOIN article a USING (idordonnance) LEFT OUTER JOIN produit pr USING (idproduit) LEFT OUTER JOIN ( SELECT idordonnance, count(idordonnance) AS nbarticle FROM article GROUP BY idordonnance ) AS A USING (idordonnance) LEFT OUTER JOIN ( SELECT idordonnance, count(idordonnance) AS nbDelivre FROM article WHERE etat='Traite' GROUP BY idordonnance ) AS B USING (idordonnance) LEFT OUTER JOIN ( SELECT idordonnance, count(DISTINCT idproduit) AS nbProduit FROM article GROUP BY idordonnance ) AS C USING (idordonnance) LEFT OUTER JOIN ( SELECT idordonnance, count(idordonnance) AS nbComplete FROM article WHERE etat='Complete' GROUP BY idordonnance ) AS D USING (idordonnance)
Voici le explain de la requête et c'est très mauvais:
Merci d'avance pour vos conseils.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 +----+-------------+------------+--------+-----------------------+-----------------------+---------+------------------------+--------+---------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+--------+-----------------------+-----------------------+---------+------------------------+--------+---------------------+ | 1 | PRIMARY | <derived5> | system | NULL | NULL | NULL | NULL | 0 | const row not found | | 1 | PRIMARY | o | ALL | NULL | NULL | NULL | NULL | 72614 | | | 1 | PRIMARY | p | eq_ref | PRIMARY | PRIMARY | 4 | pharmax.o.idposte | 1 | | | 1 | PRIMARY | a | ref | fk_article_ordonnance | fk_article_ordonnance | 5 | pharmax.o.idordonnance | 2 | | | 1 | PRIMARY | pr | eq_ref | PRIMARY | PRIMARY | 4 | pharmax.a.idproduit | 1 | Using index | | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 72225 | | | 1 | PRIMARY | <derived3> | ALL | NULL | NULL | NULL | NULL | 72225 | | | 1 | PRIMARY | <derived4> | ALL | NULL | NULL | NULL | NULL | 72225 | | | 5 | DERIVED | article | index | NULL | fk_article_ordonnance | 5 | NULL | 397774 | Using where | | 4 | DERIVED | article | index | NULL | fk_article_ordonnance | 5 | NULL | 397774 | | | 3 | DERIVED | article | index | NULL | fk_article_ordonnance | 5 | NULL | 397774 | Using where | | 2 | DERIVED | article | index | NULL | fk_article_ordonnance | 5 | NULL | 397774 | Using index | +----+-------------+------------+--------+-----------------------+-----------------------+---------+------------------------+--------+---------------------+ 12 rows in set (4.92 sec)
Partager