Mmm I just tested this and it does indeed work (although i tested with
slightly less rows :o) )


explain select count(*) , date_format(calldate, '%y-%m-%d') as m from
cdr_warehouse group by m \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: cdr_warehouse
         type: index
possible_keys: NULL
          key: calldate_idx
      key_len: 4
          ref: NULL
         rows: 26
        Extra: Using index; Using temporary; Using filesort
1 row in set (0.00 sec)

explain select count(*) , date_format(calldate, '%y-%m-%d') as m from
cdr_warehouse group by calldate \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: cdr_warehouse
         type: index
possible_keys: NULL
          key: calldate_idx
      key_len: 4
          ref: NULL
         rows: 26
        Extra: Using index

Cheers,

Ewen

On Sat, Dec 27, 2008 at 8:04 PM, ewen fortune <ewen.fort...@gmail.com> wrote:
> Hi,
>
> On Sat, Dec 27, 2008 at 6:15 PM, Chris Picton <ch...@ecntelecoms.com> wrote:
>> Hi
>>
>> I am trying to get to grips with understanding mysql performance.
>>
>> I have the following query:
>>
>> select sql_no_cache count(*), date_format(calldate, '%y-%m-%d') as m from
>> cdr_warehouse group by m;
>>
>> This gives me:
>> 115 rows in set (59.52 sec)
>>
>>
>> mysql> explain select count(*), date_format(calldate, '%y-%m-%d') as m from
>> cdr_warehouse group by m\G
>> *************************** 1. row ***************************
>>           id: 1
>>  select_type: SIMPLE
>>        table: cdr_warehouse
>>         type: index
>> possible_keys: NULL
>>          key: calldate_idx
>>      key_len: 8
>>          ref: NULL
>>         rows: 43708571
>>        Extra: Using index; Using temporary; Using filesort
>> 1 row in set (0.00 sec)
>>
>>
>> mysql> show keys from cdr_warehouse \G;
>> *************************** 1. row ***************************
>>       Table: cdr_warehouse
>>  Non_unique: 1
>>    Key_name: uploaded_idx
>> Seq_in_index: 1
>>  Column_name: uploaded
>>   Collation: A
>>  Cardinality: 66
>>    Sub_part: NULL
>>      Packed: NULL
>>        Null:
>>  Index_type: BTREE
>>     Comment:
>> *************************** 2. row ***************************
>>       Table: cdr_warehouse
>>  Non_unique: 1
>>    Key_name: calldate_idx
>> Seq_in_index: 1
>>  Column_name: calldate
>>   Collation: A
>>  Cardinality: 5526774
>>    Sub_part: NULL
>>      Packed: NULL
>>        Null:
>>  Index_type: BTREE
>>     Comment:
>>
>>
>> How can I improve the running speed of this query?  I am running 5.1.30, but
>> don't (yet) want to partition the table (horizontally or vertically).
>>  Nothing else on the server is touching this table at the moment.  The exact
>> date_format is not important, as I may want to group by 5 second intervals,
>> or full months.
>>
>> Any tips/ideas for me?
>
> Have you tried doing GROUP BY calldate ?
> select sql_no_cache count(*), date_format(calldate, '%y-%m-%d') as m from
> cdr_warehouse group by calldate;
>
> This may allow you to avoid the filesort by using the index directly
> for ordering.
>
> Also I presume this is MyISAM to avoid the InnoDB without WHERE COUNT(*) 
> issue.
>
>
> Ewen
>
>>
>> Chris
>>
>>
>> --
>> MySQL General Mailing List
>> For list archives: http://lists.mysql.com/mysql
>> To unsubscribe:    http://lists.mysql.com/mysql?unsub=ewen.fort...@gmail.com
>>
>>
>

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to