如何在mysql

时间:2015-04-22 10:12:47

标签: mysql select filter bigdata cascading

这是我遇到的另一个数据库问题。

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

  1. 过滤126M

  2. 过滤110M

  3. 过滤40M

  4. 过滤5M

  5. 过滤100k

  6. 每个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...
    

1 个答案:

答案 0 :(得分:0)

可能是您应该将所选记录的主键保存到某种临时表中?在下一步中,将临时表与主表连接。