0

这是我在这里的第一篇文章。我已经搜索了几次,找不到完全满足我需要的主题。英语不是我的主要语言,所以很可能是我没有以最佳方式搜索来找到我正在寻找的东西。

我有一个来自商业软件的数据库。它将有关文件的信息存储在几个不同的表中。我们希望做的是过滤掉所有在其中一个表中没有记录的文件。

例子:

表“文件”包含有关文件的所有信息
表“路径”包含有关文件夹或文件路径的所有信息
表“spreadlink”包含有关文件之间链接的所有信息。

我创建了一个有效的查询,但我发现它非常慢,我的问题是是否有可能在速度方面做得更好?

我想我可以left join在查询中使用类似的东西,但我在使用不同的连接方面没有那么有经验。

有关如何加快速度的任何建议?

到目前为止我的查询:

SELECT 
    f.FileID AS 'FileID', 
    CONCAT(p.path, '/', f.unixname) AS 'filepath', 
    k.Field7 as Keywords, 
    k.Field293 as Fakturerat, 
    f.UTF8Name as FileName, 
    FROM_UNIXTIME(f.CreateDate) AS 'CreateDate', 
    FROM_UNIXTIME(f.ModifyDate) AS 'ModifyDate', 
    FROM_UNIXTIME(f.AccessDate) AS 'AccessDate'
FROM 
    file AS f 
    JOIN path AS p ON (f.pathid=p.pathid)
    JOIN keyword1 AS k ON (f.fileid=k.fileid) 
WHERE 
    path LIKE '/My/path/to/folder/structure/%' 
    AND (f.fileid NOT IN (select TargetFileID from spreadlink )) 
    AND (f.fileid NOT IN (select FileID from spreadlink ));

f.FileID、和from都是标识文件或文件夹的 fileID:s,并且是所有表中的文件标识符p.FileIDTargetFileIDFileIDspreadlink

编辑:这是 mysqlslow 日志中关于查询的内容:

Query_time:12.067222 Lock_time:0.000078 Rows_sent:4153 Rows_examined:3628518

编辑:这是我查询的解释结果

+----+--------------------+------------+----------------+-------------------+-----------------+---------+--------------------+---------+--------------------------+
| id | select_type        | table      | type           | possible_keys     | key             | key_len | ref                | rows    | Extra                    |
+----+--------------------+------------+----------------+-------------------+-----------------+---------+--------------------+---------+--------------------------+
|  1 | PRIMARY            | k          | ALL            | PRIMARY           | NULL            | NULL    | NULL               | 1441716 |                          | 
|  1 | PRIMARY            | f          | eq_ref         | PRIMARY,BY_PATHID | PRIMARY         | 4       | webnative.k.FileID |       1 | Using where              | 
|  1 | PRIMARY            | p          | eq_ref         | PRIMARY,BY_PATH   | PRIMARY         | 4       | webnative.f.PathID |       1 | Using where              | 
|  3 | DEPENDENT SUBQUERY | spreadlink | index_subquery | BY_FILEID         | BY_FILEID       | 8       | func               |      20 | Using index; Using where | 
|  2 | DEPENDENT SUBQUERY | spreadlink | index_subquery | BY_TARGETFILEID   | BY_TARGETFILEID | 8       | func               |      11 | Using index; Using where | 
+----+--------------------+------------+----------------+-------------------+-----------------+---------+--------------------+---------+--------------------------+

最后我找到了原因。我在路径中有一个“下划线”(_),并且根据 mysql 这是一个通配符,它​​减慢了很多。在我在下划线符号前放置一个反斜杠 () 后,查询只需要 1 秒即可完成。

无论如何,感谢您在这件事上的帮助。

4

1 回答 1

0

我强烈建议使用 sqlfiddle.com,以便我们都可以尝试您的查询。你的path领域有索引吗?请尝试以下方法并分享您的结果:

SELECT 
    f.FileID AS 'FileID', 
    CONCAT(p.path, '/', f.unixname) AS 'filepath', 
    k.Field7 as Keywords, 
    k.Field293 as Fakturerat, 
    f.UTF8Name as FileName, 
    FROM_UNIXTIME(f.CreateDate) AS 'CreateDate', 
    FROM_UNIXTIME(f.ModifyDate) AS 'ModifyDate', 
    FROM_UNIXTIME(f.AccessDate) AS 'AccessDate'
FROM 
    file f 
    left join path p ON f.pathid = p.pathid
    left join keyword1 k ON f.fileID = k.fileid 
    left join spreadlink s on f.fileID = s.TargetFileID and f.fileID = s.FileID 
WHERE 
    path LIKE '/My/path/to/folder/structure/%' 
    and f.fileid is null
于 2013-07-02T00:29:47.043 回答