我正在查询新闻网站,该网站将找到FeaturedContent以便显示在主页上。用这种方式标记的内容被标记为“ FeaturedContent”,并在功能表中按“ homepage”排序。我目前有所需的输出,但是查询运行时间超过3秒,我需要减少该时间。像随后的查询如何优化查询?

编辑:按建议的每分钟实例化视图,最短为.4秒: 通用标签

这将按顺序返回所有主页功能,然后按日期顺序排列其他功能内容。
解释如下: 通用标签

配置文件如下: 通用标签

我刚开始阅读EXPLAIN输出,因此不确定我是否有更好的订购方法,或者可以做些简单的事情来加快它们的进度。

search_all表是物化视图表,它会定期更新,而标记和功能表是视图。这些视图不是可选的,因此无法解决。

标签视图结合了标签和关系表,以根据item_type和item_id返回标签列表,但其他视图都是一个表的简单视图。

编辑:在实例化视图中,最大的瓶颈似乎是“复制到临时表”步骤。如果不对输出进行排序,则需要0.0025秒(好得多!),但最终输出的确需要排序。有什么方法可以提高该步骤的性能或解决该问题吗?

很抱歉,如果格式难以阅读,我是新手,不确定如何定期进行格式化。
谢谢你的帮助!如果还有其他需要,请告诉我!

编辑:表大小,以供参考:
标记关系:197,411
标签:16,897
故事:51,801
图片:28,383
视频:2,408
精选:13

有帮助吗?

解决方案

我认为仅优化查询不会很有用。首先想到的是,加入一个本身由UNION构成的子查询,仅仅是性能的双重瓶颈。

如果您可以选择更改数据库结构,那么我建议将3个表storiesimagesvideos合并为一个表,如果它们看起来非常相似(将它们添加一个type ENUM('story', 'image', 'video'))以进行区分记录;这将同时删除子查询和联合。

此外,您似乎对storiesvideos的看法没有使用索引字段来过滤内容。您要查询索引列吗?

这是一个非常棘手的问题,它不知道您的完整表结构和数据重新分区!

另一种选择(不涉及对现有数据库进行修改(特别是如果已经在生产中))将“缓存”此信息到另一个表中,该表将由cron作业定期刷新。

可以在整个查询或其子部分(独立视图或将3个并集合并到单个缓存表中,等等)的不同级别上进行缓存

此选项的可行性取决于是否可以显示稍微过时的数据。对于您的数据的某些部分来说,这可能是可以接受的,这可能意味着您将仅缓存查询所涉及的表/视图的一部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top