mysql - 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”。感谢您的关注。
解决方案
您UNION ALL
可能是一次收集所有 20 组计数的最佳选择。但是考虑每小时运行一次并将其存储到另一个表中 - 然后使用从该表中获取。(数据会有点陈旧,但对于用例来说可能已经足够了。)
是的,一旦他们选择了“Lamborghini”,您将不得不返回表格以获取所有计数的修订值(减号make
)。如果有一个以开头 make
的索引,那么第二个大 UNION 将比第一个更快。
两层可能值得缓存;不仅如此,将占用大量空间以获得最小的收益。
考虑将整个数据集保存在内存中,并使用应用程序代码进行必要的计数;它可能会比使用 SQL 更快。(但更多的代码。)
推荐阅读
- java - 返回类型为 Class 的 Java 泛型
或类 - c# - 如何在 C# 的只读属性中进行两次返回?
- python - 如何摆脱 Python 中阻塞内存的变量?
- ios - NavigationLink 随机弹出并“无法呈现。请提交错误。”
- javascript - 有没有办法在带有数组的对象中搜索 mongodb 中的值,并且该值可以存在于该数组的任何对象中
- r - 为什么 is.na 和 !="" 以不同的方式过滤信息
- arrays - 如何按 PowerShell 中的所有属性进行分组?
- apscheduler - 在 python 的 APScheduler 中同时运行同一个作业不止一次
- flutter - 在多个条件下排序列表
- reactjs - 如何以所需的顺序选择不同的图像