【发布时间】:2021-08-10 05:32:07
【问题描述】:
我在 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”。 感谢您的关注。
【问题讨论】:
-
问题:随着人们为“年份”、“品牌”和“颜色”等添加过滤器,预计计数会发生变化吗?如果数据库中有 50,000 辆红色汽车,但我选择兰博基尼作为制造商,那么再显示 50,000 辆就没有意义了。在选择每个过滤器选项以进一步细化匹配数量后,您的网站是否会返回数据库?
-
您好抱歉迟到了,是的,应该再次完善。这就是我感到压力的原因。因为如果我们不需要细化匹配计数,我可以将所有过滤器选项保存在另一个表中作为静态并稍后使用。
标签: mysql optimization dynamic union