【问题标题】:MySQL query sorting/grouping performanceMySQL 查询排序/分组性能
【发布时间】:2012-07-07 23:17:56
【问题描述】:

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

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

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

【问题讨论】:

标签: php mysql performance sorting group-by


【解决方案1】:

数据越多越慢的原因是因为您的子查询是针对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

【讨论】:

  • @user1509487,太好了!如果您发现此答案有用,请将其标记为“已接受”。谢谢!
【解决方案2】:

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

  1. 创建临时表

    创建临时表 id_Temp 为 选择id 来自content 作为alt 在哪里alt.user_id = content.id

  2. 从临时表中选择数据

    选择 * 来自content WHERE content.id =(从 id_temp 中选择 id ORDER BY id DESC 限制 1) 按内容1 DESC 排序

根据我的经验,这种两步法可以使响应时间保持不变。 使用这种方法,每天 250 万页的网站与廉价的 2 Liunx BOX 配合得很好。

【讨论】:

    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2016-08-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多