我必须在别名列(total_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
查询返回我需要的内容。然而,它运行在表的所有记录然后返回结果并花费太多时间,这是不正确的方式。我有成千上万的记录,所以需要时间。我想在别名上应用密钥索引,在我的情况下是total_reports。
答案 0 :(得分:1)
从汇总结果中创建列的索引?不,我很抱歉,但MySQL本身不能这样做。
您需要的是可以索引的物化视图。 MySQL(尚未)不支持,除非您安装额外的插件。请参阅How to Create a Materialized View in MySQL。
长答案
您无法在GROUP BY
语句产生的列上创建索引。表格中的列 ,无法在行级(不是虚拟列)派生。
您的查询可能很慢,因为它可能会读取整个表格。要仅读取特定的行范围,请添加索引:
create index ix1 on `world` (`status`, `id`, `time`);
这应该使查询以更好的方式使用过滤条件,并希望通过使用索引范围扫描来加快查询速度。
另外,请更改'%%'
的{{1}}。双'%'
并没有多大意义。实际上,你应该完全删除这个条件 - 它不会过滤任何东西。
最后,如果查询仍然很慢,请使用以下命令发布执行计划:
%