MySQL中集的比较

时间:2013-11-26 20:01:07

标签: mysql pattern-matching database-performance

我遇到了以下数据库结构的挑战:

  • HEADER表名为'DOC',包含文档详细信息,其中包含文档ID
  • 详细信息表格,名为“DOC_SET”,包含与文档相关的数据。

标题表大约是16000条记录。详细信息表每个标题表平均包含75条记录(总共120万条记录)。

我有一个源文档及其相关集(源集)。这个源集我想比较其他文档的集合(我称之为目标文档和集合)。通过我的应用程序,我有一个可用源集的ID列表,以及我可以直接在查询中使用的长度(在下面的示例中显示为46个元素的列表)。

每个目标文档需要的是源和目标集的交集长度(共享元素的数量)和差异的长度(源集中的内容的长度以及目标集中的内容的长度) )用于显示。我还需要一个过滤器来仅检索源和目标之间75%交叉的记录,与源集相比。

目前我有一个查询,它通过使用包含表达式的子选择来完成此操作,但它非常慢,并且结果需要在Web应用程序的页面刷新时可用。关键是我一次只需显示大约20个结果,但在对计算字段进行排序时,我需要计算每个目标记录,然后才能进行排序和分页。

查询是这样的:

            select
                DOC.id,
                calc_subquery._calcSetIntersection,
                calc_subquery._calcSetDifference
            from
                DOC
            inner join
                (
                    select
                        DOC.id as document_id,
                        (
                            select
                                count(*)
                            from
                                DOC_SET
                            where
                                DOC_SET.doc_id = DOC.id and
                                DOC_SET.element_id in (60,114,130,187,267,394,421,424,426,603,604,814,909,1035,1142,1223,1314,1556,2349,2512,4953,5134,6318,6339,6344,6455,6528,6601,6688,6704,6705,6731,6894,6895,7033,7088,7103,7119,7129,7132,7133,7137,7154,7159,7188,7201)
                        ) as _calcSetIntersection
                        ,46-(
                            select
                                count(*)
                            from
                                DOC_SET
                            where
                                DOC_SET.doc_id = DOC.id and
                                DOC_SET.element_id in (60,114,130,187,267,394,421,424,426,603,604,814,909,1035,1142,1223,1314,1556,2349,2512,4953,5134,6318,6339,6344,6455,6528,6601,6688,6704,6705,6731,6894,6895,7033,7088,7103,7119,7129,7132,7133,7137,7154,7159,7188,7201)
                        ) as _calcSetDifference
                    from
                        DOC
                    where
                        DOC.id = 2599   
                ) as calc_subquery
            on
                DOC.id = calc_subquery.document_id
            where
                DOC.id = 2599 and
                _calcSetIntersection / 46 > 0.75;

我想知道是否:

  • 这可以在<在MySQL上100毫秒左右 在内存中运行MySQL的平均规范服务器(24Gb)。
  • 我应该使用更好的套装解决方案,或许像NoSQL解决方案。
  • 如果我应该使用某种临时表或缓存包含 计算值。这对我来说是一个问题,因为它是id的源集 可能会在查询之间发生变化,整个事情都需要 再次计算。

无论如何,一些想法或解决方案真的很受欢迎。

亲切的问候, 埃里克

0 个答案:

没有答案