On Sat, Jul 19, 2008 at 4:18 AM, Rob Wultsch <[EMAIL PROTECTED]> wrote:
> On Fri, Jul 18, 2008 at 3:46 PM, Rob Wultsch <[EMAIL PROTECTED]> wrote:
>> I'm sure there is a way to write this in a single query, but I bet it
>> it is ugly as heck, probably with a bunch of derived tables.
>
> INSERT INTO balances (userid, points)
> SELECT users.userid, users.points
> FROM users
> LEFT JOIN (
>        SELECT userid, MAX(timestamp_dump) AS 'timestamp_dump'
>        FROM balances
>        GROUP BY userid
>        ) AS b1 USING(userid)
> LEFT JOIN balances b2 USING(userid,timestamp_dump)
> WHERE users.points != b2.points
>        OR b2.points IS NULL ;
>
> This query is a dog, That stored procedure is pretty horrible. I'm
> going to play with trying to figure out how to optimize this. Fun
> stuff.

Better version of the query broken up a bit above:

        DROP TABLE IF EXISTS balances_temp;

        CREATE TEMPORARY TABLE balances_temp(userid INT, timestamp_dump
timestamp,INDEX(userid) )
        SELECT userid, MAX(timestamp_dump) AS 'timestamp_dump'
        FROM balances
        GROUP BY userid;

        INSERT INTO balances (userid, points)
        SELECT users.userid, users.points
        FROM users
        LEFT JOIN balances_temp AS b1 USING(userid)
        LEFT JOIN balances b2 USING(userid,timestamp_dump)
        WHERE users.points != b2.points OR b2.points IS NULL;

This runs ~30 seconds for 500k users, and will of course work with all
version of mysql. I did not realize that derived table performance was
that bad...

-- 
Rob Wultsch

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

Reply via email to