2010-05-30 119 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

相關問題