Hi Shawn-
This worked great.  Perfect.  Thanks very much for your help.  If I can ever be of help, let me know - I owe you one.  And thanks Michael and Roger for your help too.
 
Best regards,
Rick



From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
Sent: Friday, December 03, 2004 2:14 PM
To: [EMAIL PROTECTED]
Cc: Michael Stassen; 'Mysql'; Roger Baklund
Subject: Re: Use of limit with IN on subquery


What if we used the MySQL-specific feature "group-wise auto_increment" ?

http://dev.mysql.com/doc/mysql/en/example-AUTO_INCREMENT.html
>>>
For MyISAM and BDB tables you can specify AUTO_INCREMENT on a secondary column in a multiple-column index. In this case, the generated value for the AUTO_INCREMENT column is calculated as MAX(auto_increment_column)+1 WHERE prefix=given-prefix. This is useful when you want to put data into ordered groups.
<<<

So to group his records by k1:

CREATE TABLE groupwizeCounter (
        id int auto_incrment,
        , k1 <datatype here>
        , k2 <datatype here>
        , total_amt <datatype here>
        , PRIMARY KEY (k1, id)
} type=INNODB;

INSERT groupwizeCounter (k1, k2, total_amt)
SELECT (k1,k2,total_amt)
FROM Z
ORDER BY total_amt DESC;

SELECT k1, k2, total_amt
FROM groupwizeCounter
WHERE id <= 10;
ORDER BY k1

What do y'all think?

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine


Roger Baklund <[EMAIL PROTECTED]> wrote on 12/03/2004 12:40:24 PM:

> Michael Stassen wrote:
> >
> > Michael Stassen wrote:
> >
> >> Don't bother.  This is a very expensive solution.  You get nearly a
> >> Cartesian product on each JOIN.  I've got a 40 row test table with 20
> >> values in each of 2 groups.  The top 3 version of this examines 2302
> >> rows to produce the 3 values for each of the 2 groups.  The top 10
> >> version has been running for several minutes...
> >>
> >
> > It just finished:
> [...]
> > 2 rows in set (7 min 41.06 sec)
> >
> > Nearly 8 minutes to get the top 10 for two 20-row groups.  This
> > definitely doesn't scale.
>
> My (new) computer used 3 minutes, top 5 values took 3 seconds.
>
> I have used similar code in production, but it was not "top 10", it was
> more like top 4, and it worked just fine, millions of rows. You say
> nearly cartesian product "on each join", I would say nearly cartesian
> within each group. The size of the groups very much matters in this
> case. In my case the groups was typically 1-5 in size, sometimes 10 or
> even 100, but mostly (99%) small groups.
>
> "top 50" and definitely "top 100" would never work with this approach,
> as MySQL can only join 31 (or 63 on 64 bit platform) tables.
>
> --
> Roger
>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
>
-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to