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

C-D*_*C-D 5 mysql myisam select

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

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

filter 126M    
filter 110M    
filter 40M    
filter 5M    
filter 100k
Run Code Online (Sandbox Code Playgroud)

每一个 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`);
Run Code Online (Sandbox Code Playgroud)

这将包含来自查找表的各个数据行与过滤器之间的关系。另外,我可以使用 rrimary 索引从前一个过滤器中获取所有 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...
Run Code Online (Sandbox Code Playgroud)

pik*_*kai 1

如果filter 110M恰好是 的子集filter 126M,那么附加更多ANDWHERE可以完成这项工作。

$sql1 = "SELECT ..... WHERE ...";
$sql2 =  $sql1 . "AND column-name  = ....";
$sql3 =  $sql2 . "AND column-name  = ....";
Run Code Online (Sandbox Code Playgroud)

如果完成起来很复杂,请尝试创建前一个 SELECT 语句的视图,并且下一个 SELECT 语句应该从视图中查询。