我有一个非常庞大的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
问题是随着结果表的增长,查询变得越来越慢。 你有任何改进建议吗?另一个问题是,我无法更改表的结构,因为这是一个共享数据库,也被其他项目使用。 (我认为)唯一的改进方法是找到更有效的选择查询。
非常感谢, 菲利普
答案 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
;
另一个更复杂的解决方案是使用完整的“未处理列表”创建第四个表,然后在其他三个表上使用触发器来维护它;即