【问题标题】:How to speed up this mySQL query (filesort issue)?如何加快这个 mySQL 查询(文件排序问题)?
【发布时间】:2015-06-25 06:03:14
【问题描述】:

我有以下 MYSQL 查询:

select IF(`User`='101',`Friend`,`User`) as `Kto`,`Recent` 
from `friends` 
WHERE (`User`='101' || `Friend`='101') AND `Status`=1 
HAVING `Kto` IN (SELECT `Id` FROM `users` WHERE `Id`=`Kto` AND `Online`>='100') 
ORDER by Recent DESC limit 11

使用ORDER by Recent DESC 查询需要更长的时间(显示第 0 - 10 行(共 11 行,查询耗时 0.0090 秒)[最近:9337663 - 7683644])

如果我不使用 Order by,它太快了(显示第 0 - 10 行(共 11 行,查询耗时 0.0005 秒))

在用 ORDER by show filesort 解释查询时,我猜这是速度慢的问题,见下文:

您能帮我吗,如何摆脱这个文件排序,或者如何优化这个查询,或者帮我为这个查询添加适当的索引?

【问题讨论】:

标签: php mysql


【解决方案1】:

你可以试试这个,伙计:

SELECT
    IF(f.`User`='101',f.`Friend`,f.`User`) as `Kto`,
    f.`Recent`
FROM
    `friends` f
    INNER JOIN `users` u ON u.`Id` IN (f.`User`, f.`Friend`)
WHERE 
    (f.`User` = '101' || f.`Friend` = '101')
    AND f.`Status` = 1
    AND u.`Online` >= '100'
ORDER BY
    f.Recent DESC
LIMIT 11;

【讨论】:

  • 感谢您的快速回复,但这需要更长的时间(显示第 0 - 10 行(共 11 行,查询耗时 0.0134 秒)[最近:9348273 - 8404480])也许我应该为此创建特殊索引?
  • 我是这么认为的,为此创建索引可以帮助提高选择查询的速度。
  • 你能告诉我这个索引应该是什么样子吗?我需要为此特定查询创建索引,在此先感谢
  • 我不擅长解释,但这是我学到最多的链接:use-the-index-luke.com 用于索引的目标列可以是:friends.UserfriendsFriendfriends.Status
猜你喜欢
  • 1970-01-01
  • 2020-11-21
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多