这是我偶然发现的另一个数据库问题。
我有一个日期范围分区的 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 索引从前一个过滤器中获取所有 …