MySQL查询排序/分组性能

时间:2012-07-08 02:05:17

标签: php mysql performance sorting group-by

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

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

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

2 个答案:

答案 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来提高性能。

  1. 创建临时表

    创建临时表id_Temp为 选择idcontentaltaltuser_id = contentid

  2. 从临时表中选择数据

    SELECT * 来自content WHERE contentid =(从id_temp中选择id ORDER BY id DESC限制1) ORDER BY content1 DESC

  3. 根据我的经验,这个两步法会产生持续的响应时间。 通过这种方法,2.5百万页/天的网站与廉价的2 Liunx BOX配合良好。