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

Мне нужна ваша помощь, чтобы оптимизировать запрос, чтобы не использовать "Использование сортировки файлов". Задача запроса - выбрать все статьи, относящиеся к определенному тегу. Запрос:

  select title 
    from tag,
         article 
   where tag = 'Riyad' 
     AND tag.article_id = article.id 
order by tag.article_id

Структура таблиц следующая:

Таблица тегов

 CREATE TABLE `tag` (
 `tag` VARCHAR( 30 ) NOT NULL ,
 `article_id` INT NOT NULL ,
 KEY `tag` (`tag`),
 KEY `article_id` (`article_id`)
 ) ENGINE = MYISAM ;

Стол статьи

 CREATE TABLE `article` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `title` VARCHAR( 60 ) NOT NULL
 ) ENGINE = MYISAM 

Пример данных

 INSERT INTO `article` VALUES (1, 'About Riyad');
 INSERT INTO `article` VALUES (2, 'About Newyork');
 INSERT INTO `article` VALUES (3, 'About Paris');
 INSERT INTO `article` VALUES (4, 'About London');

 INSERT INTO `tag` VALUES ('Riyad', 1);
 INSERT INTO `tag` VALUES ('Saudia', 1);
 INSERT INTO `tag` VALUES ('Newyork', 2);
 INSERT INTO `tag` VALUES ('USA', 2);
 INSERT INTO `tag` VALUES ('Paris', 3);
 INSERT INTO `tag` VALUES ('France', 3);

2 ответа

Решение

В таблице tagзамените ключ на tag с ключом (tag, article_id):

ALTER TABLE `tag` DROP INDEX `tag`, ADD INDEX `tag_article_id` (`tag`, `article_id`)

MySQL будет использовать только один индекс таблицы для выполнения запроса. В настоящее время он использует индекс на tag, но не может использовать другой индекс для выполнения ORDER BY. Если вы поместите второй столбец в индекс, он будет использовать его для помощи с ORDER BY.

Вы присоединяетесь, частично, на tag.article_id=article.id, но у вас нет индекса на стороне тега, чтобы поддерживать это оптимально. Добавить вторичный (неуникальный) индекс на tag.article_id,

Другие вопросы по тегам