优化MySql查询以避免使用“使用filesort”
问题描述:
我需要您的帮助来优化查询避免使用“使用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);
答
在表tag
,对(tag
,article_id
)中的密钥替换tag
键:
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
上添加辅助(非唯一)索引。
+0
我做过但存在同样的问题。它使用文件排序,因为“排序”。如果我删除它的顺序,它工作正常。感谢您的帮助戴夫 – 2010-05-30 16:20:53
谢谢,它的作品! – 2010-05-30 22:19:36