3

Мне нужна ваша помощь, чтобы оптимизировать запрос до . Не используйте «Использование filesort». Задача запроса - выбрать все статьи, относящиеся к определенному тегу. Запрос:Оптимизация запроса MySql, чтобы избежать использования «Использование filesort»

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

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

стол Tag

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); 

ответ

7

В таблице 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.

+0

Спасибо, это работает! –

0

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

+0

Я сделал, но такая же проблема существует. Он использует сортировку файлов из-за «порядка». Если я удаляю его, он отлично работает. спасибо за помощь Dave –