更好的查询策略,按文件哈希频率和文件大小对文件进行排序

Posted

技术标签:

【中文标题】更好的查询策略,按文件哈希频率和文件大小对文件进行排序【英文标题】:Better query strategy to sort files by file hash frequency and file size 【发布时间】:2011-03-05 20:27:55 【问题描述】:

我没有多想就写了这个查询,但作为一个初学者,我几乎可以肯定它可以写得更好。

这里是:

    SELECT filehash, filename, filesize, group_files
      FROM files
INNER JOIN (  SELECT filehash group_id,
                     COUNT(filehash) group_files
                FROM files
            GROUP BY filehash) groups
        ON files.filehash = groups.group_id
  ORDER BY group_files DESC,
           filesize DESC

表定义:

CREATE TABLE files (fileid INTEGER PRIMARY KEY AUTOINCREMENT,
                    filename TEXT,
                    filesize INTEGER,
                    filehash TEXT)

索引定义:

CREATE INDEX files_filehash_idx
          ON files(filehash)
CREATE UNIQUE INDEX files_filename_idx
                 ON files(filename)
CREATE INDEX files_filesize_idx
          ON files(filesize)

查询解释查询计划:

selectid    order   from    detail
1           0       0       SCAN TABLE files USING COVERING INDEX files_filehash_idx (~1000000 rows)
0           0       1       SCAN SUBQUERY 1 AS groups (~100 rows)
0           1       0       SEARCH TABLE files USING INDEX files_filehash_idx (filehash=?) (~10 rows)
0           0       0       USE TEMP B-TREE FOR ORDER BY

如果我错了,你能纠正我吗?提前谢谢你。

【问题讨论】:

【参考方案1】:

你觉得这个版本怎么样?

  select filehash, group_concat(filename), filesize, count(*) as group_files
    from files
group by filehash
order by group_files desc

看起来这可能会运行得更快。它可以满足您的需要吗?

【讨论】:

我不知道SQLite还支持group_concat函数。很高兴知道!我会试试这个,然后回来说它是否更好用。谢谢! :) 抱歉错过了这个...该查询明显缩短了搜索时间,现在比以前快了 +96%!再次感谢你! :)【参考方案2】:

不。看起来很适合我。

我认为您不需要此查询的文件名索引。有计划对文件大小的索引会有所帮助,但 mysql 并没有为此使用它们。您最好用(filehash,filesize)上的复合索引替换两个单独的索引。或者你可能不会!

【讨论】:

以上是关于更好的查询策略,按文件哈希频率和文件大小对文件进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何对 YAML 文件进行排序?

torrent hash怎么用

如何在 Linux 命令行中按大小对文件进行排序

LINUX中LS对文件进行按大小排序和按时间排序,设置LS时间格式

JAVA 对文件夹下所有文件按文件大小进行排序,请问哪里有问题?

按文件大小对文件进行递归排序