3

J'ai besoin de votre aide pour optimiser la requête à évitez d'utiliser "Using filesort". Le travail de la requête est de sélectionner tous les articles qui appartiennent à tag spécifique. La requête est:Optimisation de la requête MySql pour éviter d'utiliser "Using filesort"

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

La structure des tables sont les suivantes:

table Tag

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

Article Table

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

Données d'échantillons

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

Répondre

7

Dans le tableau tag, remplacer la clé sur tag avec une touche (tag, article_id):

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

MySQL utilisera uniquement un index sur une table pour effectuer une requête. Actuellement, il utilise l'index sur tag, mais ne peut pas utiliser l'autre index pour exécuter ORDER BY. Si vous placez la deuxième colonne dans l'index, il l'utilisera pour vous aider avec ORDER BY.

+0

Merci, ça marche! –

0

Vous vous joignez, en partie, sur tag.article_id=article.id, mais n'avez pas un index en place sur le côté de l'étiquette pour soutenir de manière optimale. Ajoutez un index secondaire (non unique) sur tag.article_id.

+0

Je l'ai fait mais le même problème existe. Il utilise le tri des fichiers en raison de "ordre par". Si je supprime l'ordre par cela fonctionne bien. merci pour l'aide Dave –

Questions connexes