gpt4 book ai didi

mysql - 如何在mysql中缓存级联选择查询的子集

转载 作者:行者123 更新时间:2023-11-29 22:30:56 25 4
gpt4 key购买 nike

这是我偶然发现的另一个数据库问题。

我有一个按日期范围分区的 Myisam 查找表,其中包含 200M 记录和约 150 列。在此表上,我需要执行级联 SELECT 语句来过滤数据。输出:

  1. 过滤器126M

  2. 过滤器110M

  3. 过滤器40M

  4. 过滤器5M

  5. 过滤器 100k

每个 SELECT 都非常复杂,包含正则表达式(=不可能有索引)和多重比较,这就是为什么我希望它们查询尽可能少的行。

大约有 500 个独特的过滤器和大约 200 个固定用户。每个过滤器都需要为每个用户运行,总共大约 10 万个组合。

大问题:有没有办法让每个后续 SELECT 语句仅查询前一个子集?

示例:过滤器 #5 应该只需要查询查询 4 ​​中的 5M 行即可获得这 100k 个结果。目前它必须扫描所有 200M 记录。

编辑目前的方法:缓存表

CREATE TABLE IF NOT EXISTS cache 
( filter_id int(11) NOT NULL,
user_id int(11) NOT NULL,
lookup_id int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

ALTER TABLE cache ADD PRIMARY KEY (filter_id,user_id);

这将包含查找表中的各个数据行和过滤器之间的关系。另外,我还可以使用主索引从之前的过滤器中获取所有的lookup_ids。

查询后续过滤器:

SELECT SUM( column), COUNT(*) 
FROM cache c
LEFT JOIN lookup_table l
ON c.lookup_id= l.id
WHERE c.filter_id = 1
AND c. user_id= x
AND l.regex_column = preg_rlike...

最佳答案

也许您应该将所选记录的主键保存到某种临时表中?下一步将该临时表与主表连接起来。

关于mysql - 如何在mysql中缓存级联选择查询的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29794338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com