MYSQL Triple Join Performance帮助,复制到Tmp表
-
29-10-2019 - |
题
我正在查询新闻网站,该网站将找到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个表stories
,images
和videos
合并为一个表,如果它们看起来非常相似(将它们添加一个type ENUM('story', 'image', 'video')
)以进行区分记录;这将同时删除子查询和联合。
此外,您似乎对stories
和videos
的看法没有使用索引字段来过滤内容。您要查询索引列吗?
这是一个非常棘手的问题,它不知道您的完整表结构和数据重新分区!
另一种选择(不涉及对现有数据库进行修改(特别是如果已经在生产中))将“缓存”此信息到另一个表中,该表将由cron作业定期刷新。
可以在整个查询或其子部分(独立视图或将3个并集合并到单个缓存表中,等等)的不同级别上进行缓存
此选项的可行性取决于是否可以显示稍微过时的数据。对于您的数据的某些部分来说,这可能是可以接受的,这可能意味着您将仅缓存查询所涉及的表/视图的一部分。