在MySQL中的别名列添加索引

时间:2018-04-23 10:34:51

标签: mysql sql

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

1 个答案:

答案 0 :(得分:1)

从汇总结果中创建列的索引?不,我很抱歉,但MySQL本身不能这样做。

您需要的是可以索引的物化视图。 MySQL(尚未)不支持,除非您安装额外的插件。请参阅How to Create a Materialized View in MySQL

长答案

您无法在GROUP BY语句产生的列上创建索引。表格中的 无法在行级(不是虚拟列)派生。

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

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

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

另外,请更改'%%'的{​​{1}}。双'%'并没有多大意义。实际上,你应该完全删除这个条件 - 它不会过滤任何东西。

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

%