我無法弄清楚如何優化這個查詢並擺脫臨時表和filesort。我嘗試過加入如此多的索引而沒有運氣,因爲我真的不知道從哪裏開始,所以我已經將它們全部剝離了。從2個連接表Mysql order by filesort和臨時表非常慢
我的問題是,如果我無法更改表結構或數據而不是添加索引,我該如何儘可能優化此查詢。我可以改變查詢本身。每個表格可容納約10,000條記錄,並且在大約一個月內會增加一倍,但在可預見的將來保持這種規模。
下面我就包括表結構以及查詢我試圖執行:
CREATE TABLE IF NOT EXISTS `area` (
`id` varchar(30) NOT NULL,
`boardid` int(11) NOT NULL,
`val` mediumtext NOT NULL,
KEY `prikey` (`id`,`boardid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `subarea` (
`id` varchar(30) NOT NULL,
`boardid` int(11) NOT NULL,
`val` mediumtext NOT NULL,
KEY `prikey` (`id`,`boardid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `area_relations` (
`id` int(11) NOT NULL auto_increment,
`boardid` int(11) NOT NULL,
`areaid` varchar(30) NOT NULL,
`subareaid` varchar(30) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SELECT SQL_NO_CACHE me.id, me.areaid, me.subareaid, me.boardid
FROM database1.area_relations me
JOIN database1.area area
ON area.boardid = me.boardid AND area.id = me.areaid
JOIN database1.subarea subarea
ON subarea.boardid = me.boardid AND subarea.id = me.subareaid
WHERE me.boardid = '120' ORDER BY area.val, subarea.val
我真的很感激任何幫助,並試圖對加入,索引,文件排序等RTFMing,但我正在撞牆。
以下是解釋結果。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE me ALL NULL NULL NULL NULL 6222 Using where; Using temporary; Using filesort
1 SIMPLE area ref prikey prikey 96 database1.me.areaid,const 1 Using where
1 SIMPLE subarea ALL NULL NULL NULL NULL 7409 Using where
謝謝親切!
您確定此查詢計劃適用於您發佈的表結構嗎?你也可以製作一個[小提琴](http://sqlfiddle.com/)來重現它嗎? – Vatev