我有一个包含以下字段的表'内容':
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
它可以工作,但一旦表变大,性能就会变得太慢。 有人可以给我一个如何改进这个查询的建议吗?
答案 0 :(得分: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
答案 1 :(得分:0)
你需要两步法而不是一个完整的SQL来提高性能。
创建临时表
创建临时表id_Temp为
选择id
从content
起alt
在alt
。user_id
= content
。id
从临时表中选择数据
SELECT *
来自content
WHERE content
。id
=(从id_temp中选择id ORDER BY id
DESC限制1)
ORDER BY content1 DESC
根据我的经验,这个两步法会产生持续的响应时间。 通过这种方法,2.5百万页/天的网站与廉价的2 Liunx BOX配合良好。