SQL Query всегда использует сортировку файлов в порядке - PullRequest
0 голосов
/ 12 июля 2010

Я пытаюсь оптимизировать SQL-запрос, который использует заказ по предложению. Когда я использую EXPLAIN, запрос всегда отображает «используя файловую сортировку». Я применяю этот запрос для группового дискуссионного форума, где к сообщениям пользователей прикреплены теги.

Вот 3 таблицы, которые я использую: users, user_tag, tags

user_tag - таблица сопоставления ассоциаций для пользователей и их тегов.

CREATE TABLE `usertable` (
 `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`user_name`),
 KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `user_tag` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` int(11) unsigned NOT NULL,
 `tag_id` int(11) unsigned NOT NULL,
 `usage_count` int(11) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `tag_id` (`tag_id`),
 KEY `usage_count` (`usage_count`),
 KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Я обновляю account_count на стороне сервера, используя программирование. Вот запрос, который доставляет мне проблемы. Запрос состоит в том, чтобы выяснить tag_id и use_count для определенного имени пользователя, отсортированные по количеству использований в порядке убывания

select user_tag.tag_id, user_tag.usage_count
  from user_tag inner join usertable on usertable.user_id = user_tag.user_id
 where user_name="abc" order by usage_count DESC;

Вот вывод объяснения:

mysql> explain select
    user_tag.tag_id,
    user_tag.usage_count from user_tag
    inner join usertable on
    user_tag.user_id = usertable.user_id
    where user_name="abc" order by
    user_tag.usage_count desc;

Объясните вывод здесь

Что я должен изменить, чтобы потерять это "Использование файловой сортировки"

Ответы [ 2 ]

3 голосов
/ 12 июля 2010

Я довольно ржавый с этим, но здесь идет.

Ключ, используемый для извлечения строк, отличается от ключа, используемого в ORDER BY:

http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

Как упомянул OMG Ponies, индекс user_id, creation_count может разрешить сортировку файлов.

KEY `user_id_usage_count` (`user_id`,`usage_count`)
1 голос
/ 12 июля 2010

«Использование сортировки файлов» не обязательно плохо; во многих случаях это на самом деле не имеет значения.

Кроме того, его название несколько сбивает с толку. Функция filesort () не обязательно использует временные файлы для выполнения сортировки. Для небольших наборов данных данные сортируются в памяти, что довольно быстро.

Если вы не думаете, что это конкретная проблема (например, после профилирования вашего приложения на оборудовании промышленного уровня в лаборатории, удаление ORDER BY решает конкретную проблему производительности) или если ваш набор данных большой, вам, вероятно, не стоит беспокоиться об этом.

...