Hi!

On Jan 24, Stefan Traby wrote:
> Hi !
> 
> For my forum system, I use the following query to generate the
> main-overview: (using 4.0.16-log)
> 
> select f1.id as BoardId,
>        f1.name as Board,
>        f1.more as BoardDesc,
>        f2.id as AreaId,
>        f2.name as Area,
>        f2.more as AreaDesc,
>        count(distinct f3.id) as ThemenCount,
>        count(distinct m1.ctime) as MessageCount,
>        max(m1.ctime) as LastMessageStamp
>     from forum as f1,
>          forum as f2
>          left join forum as f3 on (f3.rid = f2.id)
>          left join forum_msg as m1 on (m1.fid = f3.id)
>     where f1.rid = 0 
>          and f2.rid = f1.id
>     group by AreaId -- note ANSI: group by AreaId, Area, AreaDesc
>     order by BoardId, AreaId;
> 
> ANSI requires to use "group by AreaId, Area, AreaDesc" instead
> of "group by AreaId" (which is a documented MySQL shortcut against
> this redundancy) but the ANSI notation is ~4 times slower.
> 
> This performance penalty is really unnessesary because the optimizer
> could detect this kind of redundancy in many cases, especially this
> simple case because "group by f2.id" generates clearly the same
> results as "group by f2.id, f2.name, f2.more" does.

Yes, you are right.
But though MySQL doesn't have this optimization, I still cannot
understand where this ~4 came from.

How big are your tables (rows and bytes) ? What are typical values for
ThemenCount and MessageCount in the result of this query ?

Can you provide the results of SHOW CREATE TABLE for forum and forum_msg ?

Regards,
Sergei

-- 
   __  ___     ___ ____  __
  /  |/  /_ __/ __/ __ \/ /   Sergei Golubchik <[EMAIL PROTECTED]>
 / /|_/ / // /\ \/ /_/ / /__  MySQL AB, Senior Software Developer
/_/  /_/\_, /___/\___\_\___/  Osnabrueck, Germany
       <___/  www.mysql.com

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to