2010-05-30 101 views
3

我需要您的帮助来优化查询避免使用“使用filesort”。查询的作业是选择属于特定标签的所有文章。查询是:优化MySql查询以避免使用“使用filesort”

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

回答

7

在表tag,对(tagarticle_id)中的密钥替换tag键:

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

MySQL将只使用一个表一个索引执行查询。目前,它正在使用tag上的索引,但不能使用其他索引执行ORDER BY。如果你将第二列放在索引中,那么它将使用它来帮助ORDER BY。

+0

谢谢,它的作品! – 2010-05-30 22:19:36

0

您正在加入,部分原因是tag.article_id=article.id,但在标签端没有适当的索引以支持最佳。在tag.article_id上添加辅助(非唯一)索引。

+0

我做过但存在同样的问题。它使用文件排序,因为“排序”。如果我删除它的顺序,它工作正常。感谢您的帮助戴夫 – 2010-05-30 16:20:53

相关问题