首页 > 解决方案 > MySQL UNION ALL 多重使用优化

问题描述

我在 MySQL 查询优化中遇到问题。情况如下。SQL 表中有超过 200000 行包含多列。我正在为这些数据在前端制作过滤器选项。例如,两列“Year”和“Make”。并且在Year栏中有许多值,如“2021”、2022、2019、2010,而在Make中则有“Ford”、“Chevrolet”等。示例链接: https ://www.autobidmaster.com/en/carfinder-online-auto-auctions/?make=Chevrolet

这些值在每列中不是唯一的。我将根据这两列的唯一值制作过滤器选项(唯一值:每列中的计数)。我想我可以在每个查询中使用按唯一值分组的数据,并在单个查询中使用 UNION ALL 合并它们。例如:对于两列 Year 和 Make

$sql1 = "
           (SELECT 'Make' as filter_option_name ,Make as filter_options_key_name, COUNT(*) as filter_option_count
           FROM dbcopart.wprdb_copartdata ". $where_str ."
           GROUP BY filter_options_key_name
           ORDER BY filter_options_key_name)
           UNION ALL 
           (SELECT 'Year' as filter_option_name ,Year as filter_options_key_name, COUNT(*) as filter_option_count
           FROM dbcopart.wprdb_copartdata  ". $where_str ."
           GROUP BY filter_options_key_name
           ORDER BY filter_options_key_name) "

有两列,没关系。工作正常。但还有另一列:超过 20 列用作过滤器选项。超过 200000 行的 20 次 UNION ALL 很慢。如何改进我的 SQL 查询?我认为应该有另一种有效的方法来代替我愚蠢的“多个 UNION ALL”。感谢您的关注。

标签: mysqloptimizationdynamicunion

解决方案


UNION ALL可能是一次收集所有 20 组计数的最佳选择。但是考虑每小时运行一次并将其存储到另一个表中 - 然后使用从该表中获取。(数据会有点陈旧,但对于用例来说可能已经足够了。)

是的,一旦他们选择了“Lamborghini”,您将不得不返回表格以获取所有计数的修订值(减号make)。如果有一个以开头 make的索引,那么第二个大 UNION 将比第一个更快。

两层可能值得缓存;不仅如此,将占用大量空间以获得最小的收益。

考虑将整个数据集保存在内存中,并使用应用程序代码进行必要的计数;它可能会比使用 SQL 更快。(但更多的代码。)


推荐阅读