我試圖優化這個查詢的限制和秩序:MySQL查詢:文件排序時內部聯接,通過
SELECT articles.id
FROM articles
INNER JOIN articles_authors ON articles.id=articles_authors.fk_Articles
WHERE articles_authors.fk_Authors=586
ORDER BY articles.publicationDate LIMIT 0,50;
表的文章:
- 引擎:MyISAM數據
- ROW_FORMAT :動態
- 行數:1 482 588
- 數據長度:788 926 672
- 最大數據長度:281 474 976 710 655
- 索引長度:127 300 608
- 數據免費:0
- 校驗:空
CREATE TABLE `articles` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `publicationDate` DATE NOT NULL DEFAULT '1970-01-01', PRIMARY KEY (`id`), KEY `publicationDate` (`publicationDate`) ) ENGINE=MYISAM AUTO_INCREMENT=1498496 DEFAULT CHARSET=utf8
表articles_authors:
- 引擎:MyISAM
- ROW_FORMAT:動態
- 行數:1 970 750
- DATA_LENGTH:45 008 420
- 最大數據長度:281 474 976 710 655
- 索引長度:127 300 608
- 數據免費:0
- 校驗:空
CREATE TABLE `articles_authors` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `fk_Articles` int(10) unsigned NOT NULL, `fk_Authors` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `fk_Articles_fk_Authors` (`fk_Articles`,`fk_Authors`), KEY `fk_Articles` (`fk_Articles`), KEY `fk_Authors` (`fk_Authors`), ) ENGINE=MyISAM AUTO_INCREMENT=2349047 DEFAULT CHARSET=utf8
解釋上查詢:
id (1), select_type(SIMPLE), TABLE(articles_authors), TYPE(ref), possible_keys(fk_Articles_fk_Authors, fk_Articles, fk_Authors), KEY (fk_Authors), Key_len(4), ref(const), ROWS(171568), extra (USING TEMPORARY; USING FILE sort)
id (1), select_type(SIMPLE), TABLE(articles), TYPE(eq_ref), possible_keys(PRIMARY), KEY (PRIMARY), Key_len(4), ref(articles_authors.fk_Authors), ROWS(1), extra()
正如你所看到的,SQL查詢不優化(使用文件排序中講解)。
感謝您的幫助!
+1,對於一個有據可查的問題!當人們真正包含相關信息時就喜歡它! – 2011-04-22 17:59:09
我不明白這可以如何優化更多,因爲在where/order子句中,您具有來自兩個不同表格的值,並且您無法創建組合索引'(fk_Authors,publicationDate)' – Pentium10 2011-04-22 21:30:22
編輯答案包括去標準化選項。 – Johan 2011-04-26 12:31:13