我需要您的帮助来优化查询避免使用“使用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);
答案 0 :(得分:8)
在表格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。
答案 1 :(得分:0)
您正在部分加入tag.article_id=article.id
,但在标记方面没有适当的索引来支持最佳状态。在tag.article_id
上添加辅助(非唯一)索引。