这是一个耗时超过 20 分钟的查询。
SELECT * FROM company WHERE Age>5 GROUP BY Network ORDER BY Network DESC LIMIT 0,2001
我有关于年龄和网络的索引。有没有办法更有效地运行这个查询?可以选择使用服务器端语言 (php) 运行多个单独的查询。
最佳答案
根据age、network、companyid
创建复合索引并测试其运行时间:
SELECT network, min(companyid)
FROM company
WHERE Age > 5
GROUP BY network;
这应该使用索引并且相当快。
现在,加入以获取其余信息:
select c.*
from company c join
(SELECT network, min(companyid) as mincompanyid
FROM company
WHERE Age > 5
GROUP BY network
ORDER BY network DESC
LIMIT 0, 2001
) n
ON c.companyid = n.mincompanyid;
假设company
有一个名为companyid
的主键和一个关于age、network、companyid
的复合索引。
编辑:
如果第一个查询不相当快,则估计获取 2001 个不重复名称所需的行数。然后执行:
select c.*
from company c join
(SELECT network, min(companyid) as mincompanyid
FROM (SELECT c.*
FROM company
WHERE Age > 5
ORDER BY network DESC
LIMIT 10000
) c
GROUP BY network
ORDER BY network DESC
LIMIT 0, 2001
) n
ON c.companyid = n.mincompanyid;
在本例中,假设 10,000 个网络足以容纳 2,001 个网络。此版本应该修复性能问题。
关于mysql - 我怎样才能更好地优化这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287565/