Good try! But I was not clear. Try an index just for kind, and another
separate index just for status. You are down to 4 x 768 (3072) from 95691.
That is much better. Again, drop the create separate indexes for kind and
status and  index_reports_on_kind_and_status .

On Tue, Apr 12, 2011 at 2:11 PM, vincent <vinc...@louviaux.com> wrote:

> 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.
>

-- 
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.

Reply via email to