Re: Group by

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Dec 9, 2009, at 12:58 PM, host@xxxxxxxxxxxxxxxxx wrote:

> The only SELECT is on MAX('timestamp').  There is really nothing to Group BY in this query.
> 
> Dewey
> 
> Philip Thompson wrote:
>> Hi.
>> 
>> In a mysql query, it is recommended that "GROUP BY" fields be indexed? Using EXPLAIN on one of my queries, I noticed no change between having indexed by GROUP BY field and not indexing it. Any thoughts would be appreciated.
>> 
>> In this example, should `history_field` be indexed...?
>> 
>> SELECT MAX(`timestamp`) AS `max_ts` FROM `history` WHERE `req_id` = 17 AND `history_record_id` = 35
>> GROUP BY `history_field`
>> 
>> Thanks,
>> ~Philip

Well, that was just an example query. My real one is....

SELECT `h`.*
FROM (
    SELECT MAX(`history_timestamp`) AS `max_ts`
    FROM `history`
    WHERE `req_id` = 17 AND `history_record_id` = 35
    GROUP BY `history_field`
) AS `max`
    INNER JOIN `history` `h` ON `max`.`max_ts` = `h`.`history_timestamp`
WHERE `req_id` = 17 AND `history_record_id` = 35
GROUP BY `history_field`

This returns the results I need. The explain (split up) from this query is...

+----+-------------+------------+------+--------------------------------------------+
| id | select_type | table      | type | possible_keys                              |
+----+-------------+------------+------+--------------------------------------------+
|  1 | PRIMARY     | h          | ref  | req_id_history_record_id,history_timestamp |
|  1 | PRIMARY     | <derived2> | ALL  | NULL                                       |
|  2 | DERIVED     | history    | ref  | req_id_history_record_id                   |
+----+-------------+------------+------+--------------------------------------------+

--------------------------+---------+-------------+------+----------------------------------------------+
 key                      | key_len | ref         | rows | Extra                                        |
--------------------------+---------+-------------+------+----------------------------------------------+
 req_id_history_record_id | 8       | const,const |    3 | Using temporary; Using filesort              |
 NULL                     | NULL    | NULL        |    2 | Using where                                  |
 req_id_history_record_id | 8       |             |    3 | Using where; Using temporary; Using filesort |
--------------------------+---------+-------------+------+----------------------------------------------+  
3 rows in set (0.01 sec)

There's only 10 records in table right now... but the # of rows it's going to traverse before find the results is very small. 

Do I need to include `history_field` in the inner select?

Thanks,
~Philip

[Index of Archives]     [PHP Home]     [PHP Users]     [Postgresql Discussion]     [Kernel Newbies]     [Postgresql]     [Yosemite News]

  Powered by Linux