这是我遇到的另一个数据库问题。
我有一个日期范围分区的Myisam查找表,包含200M记录和~150列。 在此表中,我需要执行级联SELECT-Statements来过滤数据。 输出:
过滤126M
过滤110M
过滤40M
过滤5M
过滤100k
每个SELECT都是高度复杂的regex(=无索引)和多重比较,这就是为什么我希望它们查询可能的行数最少。
大约有500个独特的过滤器和大约200个常量用户。需要为每个用户运行每个过滤器,总共大约100k组合。
大问题: 有没有办法让每个后续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);
这将包含查找表和过滤器中各个数据行之间的关系。 PLUS我可以使用主索引来获取前一个过滤器中的所有lookup_id。
查询后续过滤器:
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...
答案 0 :(得分:0)
可能是您应该将所选记录的主键保存到某种临时表中?在下一步中,将临时表与主表连接。