繁体   English   中英

在MySQL中的别名列上添加索引

[英]Add index on alias column in MySQL

我必须对别名列(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的别名。

根据汇总结果在列上创建索引? 不,对不起,但是MySQL无法本地完成。

您需要的可能是可以索引的实例化视图 到目前为止,MySQL不支持,除非您安装了额外的插件。 请参见如何在MySQL中创建实例化视图

长答案

您不能在由GROUP BY语句产生的列上创建索引。 该列在表上不存在 ,并且不能在行级别派生 (不是虚拟列)。

您的查询速度可能很慢,因为它可能正在读取整个表。 要仅读取特定范围的行,请添加索引:

create index ix1 on `world` (`status`, `id`, `time`);

这应该使查询以更好的方式使用过滤条件,并希望通过使用和索引范围扫描来加快查询速度。

另外,请将'%%'更改为'%' Double %没有太大意义。 实际上,您应该完全删除此条件-它没有过滤任何内容。

最后,如果查询仍然很慢,请使用以下命令发布执行计划:

explain <my_query_here>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM