【问题标题】:MySQL - SELECT + JOIN + ORDER BY performanceMySQL - SELECT + JOIN + ORDER BY 性能
【发布时间】:2011-05-17 08:39:20
【问题描述】:

我有两个表,我需要从两个表中选择一些数据

SELECT f.* 
FROM file_data f
JOIN subscriptions s ON f.uid = s.elementid
WHERE s.uid = 119762 AND f.private=0  
ORDER BY f.date DESC

现在,即使是一小部分数据,查询也需要一秒钟的时间。 这是由于 ORDER BY f.date 导致的“订阅”上使用了“文件排序”和“临时”(删除该条件会导致时间下降到 0.01 秒以下)

谁能告诉我如何加快查询速度?

这是 EXPLAIN 的结果

id  select_type    table    type   possible_keys    key            key_len  ref           rows  Extra
1    SIMPLE         s        ref    uid_elementid    uid_elementid  4        const         171   Using index; Using temporary; Using filesort
1    SIMPLE         f        ref    uid_uname        uid_uname      5        s.elementid   22    Using where

【问题讨论】:

    标签: mysql performance join sql-order-by


    【解决方案1】:

    你应该在 f.date 上放一个索引

    【讨论】:

    • file_data.date 上已经有索引,我不知道为什么它没有被列为可能的键...
    • 当记录数较少时,索引将无济于事。
    • 您还应该在 f.uid、s.elementid、s.uid 和 f.private 上放置一个索引。根据您的喜好,选择 LEFT JOIN 可能就足够了,而且速度更快。
    • JochenJung 现在我都有了,但没有一个被列为已使用。
    【解决方案2】:

    什么时候索引可以帮助排序是非常容易预测的。它很少像“索引order by 中的字段”那么简单。 This link 有详细的细节。如果您认为您有正确的索引并且优化器只是没有决定使用它们,请使用index hint 向数据库服务器建议索引。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,这是我的解决方案:

      SELECT f.* 
      FROM (SELECT * FROM file_data WHERE `private`=0 ORDER BY `date` DESC ) f
      JOIN subscriptions s ON f.uid = s.elementid
      WHERE s.uid = 119762
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多