I have add an index ALTER TABLE `reports` ADD INDEX `index_reports_on_kind_and_status` ( `kind` , `status` )
it s better but maybe not perfect as the query is performed on each pages in the dashboard Thanks Vincent mysql> explain SELECT `nodes`.* FROM `nodes` INNER JOIN `reports` ON reports.node_id = nodes.id WHERE ((reports.kind = 'apply' AND reports.status != 'failed') AND (`nodes`.`hidden` = 0)) GROUP BY nodes.id; +----+-------------+---------+--------+-----------------------------------------------------------+----------------------------------+---------+---------------------------+-------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+--------+-----------------------------------------------------------+----------------------------------+---------+---------------------------+-------+----------------------------------------------+ | 1 | SIMPLE | reports | ref | index_reports_on_node_id,index_reports_on_kind_and_status | index_reports_on_kind_and_status | 768 | const | 19483 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | nodes | eq_ref | PRIMARY | PRIMARY | 4 | dashboard.reports.node_id | 1 | Using where | +----+-------------+---------+--------+-----------------------------------------------------------+----------------------------------+---------+---------------------------+-------+----------------------------------------------+ 2 rows in set (0.00 sec) 2011/4/12 Charles Johnson <gm.johns...@gmail.com> > A couple of things to notice. First, only the nodes.id index and > index_reports_on_node_id > index are used, and since index_reports_on_node_id is used as a ref type > you will have 573 x 167 rows to examine (95,651 more or less) to produce the > rows your sql finally fetches. You might --important: might-- be able to do > better. There is an index: index_reports_on_time_and_node_id_and_status, > which includes node_id and status, but is not used. Without hurting > anything, and without changing the query you could create an index on > reports.kind and reports.status. This might help if there are lots of > different values for kind and status. For example, you generally do not want > to create an index for a column where the only values are 'true' and > 'false', say. That effectively divides the table in half, and if you have a > million rows, reducing a full scan to 500,000 may not help much. > > But anyway, if you know how to create indexes, this is what I would try > first. > > Others probably have much better ideas. You might ping a mysql list as > well. > > On Tue, Apr 12, 2011 at 11:26 AM, vincent <vinc...@louviaux.com> wrote: > >> here is the result , I don't know what to do :( >> >> mysql> explain SELECT `nodes`.* FROM `nodes` INNER JOIN `reports` ON >> reports.node_id = nodes.id WHERE ((reports.kind = 'apply' AND >> reports.status != 'failed') AND (`nodes`.`hidden` = 0)) GROUP BY nodes.id >> ; >> >> +----+-------------+---------+-------+--------------------------+--------------------------+---------+--------------------+------+-------------+ >> | id | select_type | table | type | possible_keys | key >> | key_len | ref | rows | Extra | >> >> +----+-------------+---------+-------+--------------------------+--------------------------+---------+--------------------+------+-------------+ >> | 1 | SIMPLE | nodes | index | PRIMARY | PRIMARY >> | 4 | NULL | 573 | Using where | >> | 1 | SIMPLE | reports | ref | index_reports_on_node_id | >> index_reports_on_node_id | 5 | dashboard.nodes.id | 167 | Using >> where | >> >> +----+-------------+---------+-------+--------------------------+--------------------------+---------+--------------------+------+-------------+ >> 2 rows in set (0.00 sec) >> >> <http://nodes.id/> >> >> 2011/4/12 Charles Johnson <gm.johns...@gmail.com> >> >>> You have a partial (i.e., three-part) index 'time', 'node_id', 'status' >>> from which you appear to be selecting against only two parts. On the mysql >>> command line run the query by hand preceded by the keywprd "explain" >>> >>> explain select nodes blah blah blah >>> >>> You should get back a listing that will let you see how the indexes are >>> being used (or abused!). You may discover that in addition to the composite >>> index you have that two additional indexes will help. >>> >>> ~Charles~ >>> >>> >>> On Tue, Apr 12, 2011 at 9:15 AM, Vincent <vlouvi...@gmail.com> wrote: >>> >>>> I have noticed thaht when I remove ((reports.kind = ‘apply’ AND >>>> reports.status = ‘failed’) part from the query, the query is very >>>> quick. >>>> >>>> mysql> show index from reports from dashboard; >>>> +---------+------------+---------------------------------------------- >>>> +--------------+-------------+-----------+-------------+---------- >>>> +--------+------+------------+---------+ >>>> | Table | Non_unique | Key_name >>>> | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | >>>> Packed | Null | Index_type | Comment | >>>> +---------+------------+---------------------------------------------- >>>> +--------------+-------------+-----------+-------------+---------- >>>> +--------+------+------------+---------+ >>>> | reports | 0 | PRIMARY >>>> | 1 | id | A | 112252 | NULL | >>>> NULL | | BTREE | | >>>> | reports | 1 | index_reports_on_node_id >>>> | 1 | node_id | A | 652 | NULL | >>>> NULL | YES | BTREE | | >>>> | reports | 1 | index_reports_on_time_and_node_id_and_status >>>> | 1 | time | A | 112252 | NULL | >>>> NULL | YES | BTREE | | >>>> | reports | 1 | index_reports_on_time_and_node_id_and_status >>>> | 2 | node_id | A | 112252 | NULL | >>>> NULL | YES | BTREE | | >>>> | reports | 1 | index_reports_on_time_and_node_id_and_status >>>> | 3 | status | A | 112252 | NULL | >>>> NULL | YES | BTREE | | >>>> +---------+------------+---------------------------------------------- >>>> +--------------+-------------+-----------+-------------+---------- >>>> +--------+------+------------+---------+ >>>> 5 rows in set (0.01 sec) >>>> >>>> >>>> >>>> On Apr 12, 4:04 pm, Charles Johnson <gm.johns...@gmail.com> wrote: >>>> > What indexes do you have on the respective tables? >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > On Tue, Apr 12, 2011 at 5:25 AM, Vincent <vlouvi...@gmail.com> wrote: >>>> > > I have increase the mysql like this but the queries takes still more >>>> > > than 9sec for the first page. >>>> > > any other suggestions for the mysql tuning ? >>>> > >>>> > > key_buffer=64M >>>> > > sort_buffer=4M >>>> > > query_cache_size = 20M >>>> > > read_buffer_size=1M >>>> > >>>> > > Node Load (9090.5ms) SELECT `nodes`.* FROM `nodes` INNER JOIN >>>> > > `reports` ON reports.node_id = nodes.id WHERE ((reports.kind = >>>> 'apply' >>>> > > AND reports.status != 'failed') AND (`nodes`.`hidden` = 0)) GROUP BY >>>> > > nodes.id >>>> > > Node Load (9082.9ms) SELECT `nodes`.* FROM `nodes` INNER JOIN >>>> > > `reports` ON reports.node_id = nodes.id WHERE ((reports.kind = >>>> 'apply' >>>> > > AND reports.status = 'failed') AND (`nodes`.`hidden` = 0)) GROUP BY >>>> > > nodes.id >>>> > >>>> > > On Apr 11, 4:19 pm, Vincent <vlouvi...@gmail.com> wrote: >>>> > > > Thanks >>>> > >>>> > > > I have make the >>>> > > > rake RAILS_ENV=production db:raw:optimize >>>> > > > and in the my.cnf >>>> > > > query_cache_size = 20000000 >>>> > >>>> > > > Its really better >>>> > >>>> > > > Vincent >>>> > >>>> > > > On 11 avr, 14:26, Mohamed Lrhazi <lrh...@gmail.com> wrote: >>>> > >>>> > > > > There's some rake tasks, and other things, suggested here: >>>> > >https://github.com/puppetlabs/puppet-dashboard >>>> > >>>> > > > > On Mon, Apr 11, 2011 at 5:29 AM, Vincent <vlouvi...@gmail.com> >>>> wrote: >>>> > > > > > Hello, >>>> > >>>> > > > > > since the last upgrade to V1.1.0 >>>> > > > > > The dashboard is very slow >>>> > >>>> > > > > > I notice this slow queries in the log : >>>> > >>>> > > > > > Node Load (14178.9ms) SELECT `nodes`.* FROM `nodes` INNER >>>> JOIN >>>> > > > > > `reports` ON reports.node_id = nodes.id WHERE ((reports.kind >>>> = >>>> > > 'apply' >>>> > > > > > AND reports.status != 'failed') AND (`nodes`.`hidden` = 0)) >>>> GROUP BY >>>> > > > > > nodes.id >>>> > > > > > Node Load (13149.9ms) SELECT `nodes`.* FROM `nodes` INNER >>>> JOIN >>>> > > > > > `reports` ON reports.node_id = nodes.id WHERE ((reports.kind >>>> = >>>> > > 'apply' >>>> > > > > > AND reports.status = 'failed') AND (`nodes`.`hidden` = 0)) >>>> GROUP BY >>>> > > > > > nodes.id >>>> > >>>> > > > > > How can i optimize the DB ? >>>> > >>>> > > > > > Vincent >>>> > >>>> > > > > > -- >>>> > > > > > You received this message because you are subscribed to the >>>> Google >>>> > > Groups "Puppet Users" group. >>>> > > > > > To post to this group, send email to >>>> puppet-users@googlegroups.com. >>>> > > > > > To unsubscribe from this group, send email to >>>> > > puppet-users+unsubscr...@googlegroups.com. >>>> > > > > > For more options, visit this group athttp:// >>>> > > groups.google.com/group/puppet-users?hl=en. >>>> > >>>> > > -- >>>> > > You received this message because you are subscribed to the Google >>>> Groups >>>> > > "Puppet Users" group. >>>> > > To post to this group, send email to puppet-users@googlegroups.com. >>>> > > To unsubscribe from this group, send email to >>>> > > puppet-users+unsubscr...@googlegroups.com. >>>> > > For more options, visit this group at >>>> > >http://groups.google.com/group/puppet-users?hl=en. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Puppet Users" group. >>>> To post to this group, send email to puppet-users@googlegroups.com. >>>> To unsubscribe from this group, send email to >>>> puppet-users+unsubscr...@googlegroups.com. >>>> For more options, visit this group at >>>> http://groups.google.com/group/puppet-users?hl=en. >>>> >>>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Puppet Users" group. >>> To post to this group, send email to puppet-users@googlegroups.com. >>> To unsubscribe from this group, send email to >>> puppet-users+unsubscr...@googlegroups.com. >>> For more options, visit this group at >>> http://groups.google.com/group/puppet-users?hl=en. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Puppet Users" group. >> To post to this group, send email to puppet-users@googlegroups.com. >> To unsubscribe from this group, send email to >> puppet-users+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/puppet-users?hl=en. >> > > -- > You received this message because you are subscribed to the Google Groups > "Puppet Users" group. > To post to this group, send email to puppet-users@googlegroups.com. > To unsubscribe from this group, send email to > puppet-users+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/puppet-users?hl=en. > -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.