Лучшая стратегия запросов для сортировки файлов по частоте и размеру файла - PullRequest
1 голос
/ 05 марта 2011

Я написал этот запрос, не задумываясь, но как новичок, я почти уверен, что он мог бы быть написан лучше.

Вот он:

    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

Не могли бы вы исправить меня, если я ошибаюсь?Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Что вы думаете об этой версии?

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

Кажется, что это, вероятно, будет работать быстрее. Это делает то, что вам нужно?

0 голосов
/ 06 марта 2011

Неа. Смотрит на меня.

Я не думаю, что вам нужен индекс по имени файла для этого запроса. Существуют планы, где поможет индекс по размеру файла, но MySQL не использует их для этого. Возможно, лучше заменить два отдельных индекса на составной индекс (filehash, filesize). Или нет!

...