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)
如果filter 110M
恰好是 的子集filter 126M
,那么附加更多AND
就WHERE
可以完成这项工作。
$sql1 = "SELECT ..... WHERE ...";
$sql2 = $sql1 . "AND column-name = ....";
$sql3 = $sql2 . "AND column-name = ....";
Run Code Online (Sandbox Code Playgroud)
如果完成起来很复杂,请尝试创建前一个 SELECT 语句的视图,并且下一个 SELECT 语句应该从视图中查询。
归档时间: |
|
查看次数: |
741 次 |
最近记录: |