这是我在这里的第一篇文章。我已经搜索了几次,找不到完全满足我需要的主题。英语不是我的主要语言,所以很可能是我没有以最佳方式搜索来找到我正在寻找的东西。
我有一个来自商业软件的数据库。它将有关文件的信息存储在几个不同的表中。我们希望做的是过滤掉所有在其中一个表中没有记录的文件。
例子:
表“文件”包含有关文件的所有信息
表“路径”包含有关文件夹或文件路径的所有信息
表“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.FileID
。TargetFileID
FileID
spreadlink
编辑:这是 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 秒即可完成。
无论如何,感谢您在这件事上的帮助。