我必须对别名列(total \u reports)的查询结果进行排序,该列按条件分组,限制有50条记录。请告诉我我在哪里失踪了,
SELECT Count(world_name) AS total_reports,
name,
Max(last_update) AS report
FROM `world`
WHERE ( `id` = ''
AND `status` = 1 )
AND `time` >= '2017-07-16'
AND `name` LIKE '%%'
GROUP BY `name`
HAVING `total_reports` >= 2
ORDER BY `total_reports` DESC
LIMIT 50 offset 0
查询返回我需要的。然而,它在表的所有记录上运行,然后返回结果,并且花费了太多时间,这是不正确的方法。我有上千张唱片,所以这需要时间。我想在别名上应用键索引,它是我的情况下的总报告数。
1条答案
按热度按时间atmip9wb1#
从聚合结果在列上创建索引?不,我很抱歉,但mysql不能在本机上这样做。
您需要的可能是一个可以索引的物化视图。mysql还不支持,除非你安装了额外的插件。了解如何在mysql中创建物化视图。
长话短说
不能对由
GROUP BY
声明。该列在表中不存在,并且不能在行级别派生(不是虚拟列)。您的查询可能很慢,因为它可能正在读取整个表。要仅读取特定范围的行,请添加索引:
这将使查询以更好的方式使用过滤条件,并有望通过使用和索引范围扫描来加快查询速度。
另外,请换衣服
'%%'
为了'%'
. 双倍%
没什么意义。实际上,您应该完全删除这个条件—它不过滤任何内容。最后,如果查询仍然很慢,请使用以下方式发布执行计划: