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

Sqlite 根据文件哈希频率和文件大小对文件进行排序的更好的查询策略,sqlite,query-optimization,Sqlite,Query Optimization,我写这个查询时没有太多考虑,但作为一个初学者,我几乎可以肯定它可以写得更好 这是: SELECT filehash, filename, filesize, group_files FROM files INNER JOIN ( SELECT filehash group_id, COUNT(filehash) group_files FROM files GROUP BY f

我写这个查询时没有太多考虑,但作为一个初学者,我几乎可以肯定它可以写得更好

这是:

    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)
索引定义:

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

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

没有。对我来说很合适


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

没有。对我来说很合适


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

你觉得这个版本怎么样

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

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

您觉得这个版本怎么样

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

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

我不知道SQLite也支持
group\u concat
功能。很高兴知道!我会试试这个,然后回来说它是否更好。谢谢!:)很抱歉错过了这个。。。该查询明显缩短了搜索时间,现在比以前快了96%!再次感谢你!:)我不知道SQLite还支持
group\u concat
函数。很高兴知道!我会试试这个,然后回来说它是否更好。谢谢!:)很抱歉错过了这个。。。该查询明显缩短了搜索时间,现在比以前快了96%!再次感谢你!:)