MySql SELECT查询庞大数据库中的性能问题

时间:2015-10-14 15:46:27

标签: mysql database performance

我有一个非常庞大的MySQL数据库,在选择数据时遇到性能问题。让我先解释一下我在项目中做了什么:我有一个文件列表。应使用许多工具分析每个文件。分析结果存储在结果表中。

我有一个包含文件(样本)的表。该表包含大约1000万行。架构如下所示:

idsample|sha256|path|...

另一个(非常小的表)是一个标识工具的表。架构:

idtool|name

第三张桌子将是最大的一张桌子。该表包含了我用来分析文件的所有工具的结果(行数将是TIMES文件的工具数)。架构:

id|idsample|idtool|result information| ...

我正在寻找的是一个查询,它返回给定工具ID的UNPROCESSED文件(其中还没有结果)。 到目前为止,我发现查询这些条目的(最有效的)方法如下:

SELECT
    s.idsample
FROM
    samples AS s
WHERE
    s.idsample NOT IN (
        SELECT
            idsample
        FROM
            results
        WHERE
            idtool = 1
    )
LIMIT 100

问题是随着结果表的增长,查询变得越来越慢。 你有任何改进建议吗?另一个问题是,我无法更改表的结构,因为这是一个共享数据库,也被其他项目使用。 (我认为)唯一的改进方法是找到更有效的选择查询。

非常感谢, 菲利普

1 个答案:

答案 0 :(得分:1)

左连接可能表现更好,特别是如果在两个表中索引了idsample;根据我的经验,JOINs更好地服务于那些“查询”,而不是那种子查询。

SELECT s.idsample
FROM samples AS s 
LEFT JOIN results AS r ON s.idsample = r.idsample AND r.idtool = 1
WHERE r.idsample IS NULL
LIMIT 100
;

另一个更复杂的解决方案是使用完整的“未处理列表”创建第四个表,然后在其他三个表上使用触发器来维护它;即

  • 添加新工具时,将所有当前文件添加到第四个表(使用新工具)。
  • 添加新文件时,将所有当前工具添加到第四个表(使用新文件)。
  • 当输入新结果时,从第四个表中删除相应的记录。