摆脱缓慢的子查询

时间:2014-05-06 08:49:32

标签: mysql sql database-performance

我有一个连接到我服务器的数据库,目前有2,300,000行。

我运行以下查询以查找用户的连接,如果nick / ip / client_id相同则删除重复项。

SELECT
    `nick`,
    INET_NTOA(`ip`) as `ip`,
    HEX(`client_id`) as `client_id`,
    UNIX_TIMESTAMP(`date`) as `date`
FROM
    (SELECT * FROM `joins` ORDER BY `date` DESC) as `sub`
WHERE
    `nick` LIKE '%nick%'
    -- Can also be things like this:
    --   `ip` & INET_ATON('255.255.0.0') = INET_ATON('123.123.0.0')
GROUP BY
    `nick`,
    `ip`,
    `client_id`
ORDER BY
    `date` DESC
LIMIT 500

为什么我首先使用子查询?使用GROUP BY时获取最新日期值。

1 个答案:

答案 0 :(得分:1)

我认为您误解了ORDER BYGROUP BY在此查询中的作用。为了获得每nick,ip,client_id的最新日期,您可以按如下方式编写查询:

SELECT
    `nick`,
    INET_NTOA(`ip`) as `ip`,
    HEX(`client_id`) as `client_id`,
    MAX(UNIX_TIMESTAMP(`date`)) as `date`
FROM
`joins`
WHERE
    `nick` LIKE '%nick%'
    -- Can also be things like this:
    --   `ip` & INET_ATON('255.255.0.0') = INET_ATON('123.123.0.0')
GROUP BY
    `nick`,
    `ip`,
    `client_id`
ORDER BY
    `date` DESC
LIMIT 500

根本不需要子查询。此代码对数据进行分组,然后返回

的最大值
UNIX_TIMESTAMP(`date`)

date