sql在mysql中的alias列上添加索引

8yoxcaq7  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(288)

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

查询返回我需要的。然而,它在表的所有记录上运行,然后返回结果,并且花费了太多时间,这是不正确的方法。我有上千张唱片,所以这需要时间。我想在别名上应用键索引,它是我的情况下的总报告数。

atmip9wb

atmip9wb1#

从聚合结果在列上创建索引?不,我很抱歉,但mysql不能在本机上这样做。
您需要的可能是一个可以索引的物化视图。mysql还不支持,除非你安装了额外的插件。了解如何在mysql中创建物化视图。
长话短说
不能对由 GROUP BY 声明。该列在表中不存在,并且不能在行级别派生(不是虚拟列)。
您的查询可能很慢,因为它可能正在读取整个表。要仅读取特定范围的行,请添加索引:

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

这将使查询以更好的方式使用过滤条件,并有望通过使用和索引范围扫描来加快查询速度。
另外,请换衣服 '%%' 为了 '%' . 双倍 % 没什么意义。实际上,您应该完全删除这个条件—它不过滤任何内容。
最后,如果查询仍然很慢,请使用以下方式发布执行计划:

explain <my_query_here>

相关问题