2

我有一个包含以下字段的表“内容”:

id (an unique, increasing identifier)
user_id
content1
content2
content3
...

该表可以包含来自相同或不同的数据user_id。我正在尝试选择按其中一个content字段排序的数据。但是,我只想从不同的“user_id”中选择数据,并始终采用用户的最新条目(因此是最高id值)。我不能仅仅group by user_id因为分组发生在排序之前。

这就是我目前正在做的事情:

SELECT *
FROM `content`
WHERE `content`.`id` = (
    SELECT `id`
    FROM `content` as `alt`
    WHERE `alt`.`user_id` = `content`.`id`
    ORDER BY `id` DESC
    LIMIT 1 )
ORDER BY content1 DESC

它可以工作,但是一旦表变大,性能就会变得太慢。有人可以给我一个建议如何改进这个查询吗?

4

2 回答 2

3

数据越多越慢的原因是因为您的子查询正在为表中的每一行content执行。

此解决方案应该更快,因为子选择只会执行一次,然后该子选择的结果将连接到同一个表 - 使用索引:

SELECT b.*
FROM
(
    SELECT MAX(id) AS maxid
    FROM content
    GROUP BY user_id
) a
INNER JOIN content b ON a.maxid = b.id
ORDER BY b.content1 DESC
于 2012-07-08T02:10:00.000 回答
0

您需要 2 步方法而不是 1 个完整的 SQL 来提高性能。

  1. 创建临时表

    创建临时表 id_Temp as SELECT id FROM contentas alt WHERE altuser_id= contentid

  2. 从临时表中选择数据

    选择 * 从content 哪里contentid= ( 从 id_temp 中选择 id ORDER BY idDESC 限制 1) ORDER BY content1 DESC

以我的经验,这种两步方法使响应时间恒定。使用这种方法,250 万页/天的网站与廉价的 2 Liunx BOX 配合得很好。

于 2012-07-08T08:08:35.400 回答