2014-03-25 57 views
0

我無法弄清楚如何優化這個查詢並擺脫臨時表和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 

謝謝親切!

+0

您確定此查詢計劃適用於您發佈的表結構嗎?你也可以製作一個[小提琴](http://sqlfiddle.com/)來重現它嗎? – Vatev

回答

2

嘗試area_relations創建下列指標:

create index idx_area_relations_board_id_id on area_relations(board_id, id) 

這將使where子句中使用過濾。

由於您按多個表中的列進行排序,您會遇到filesort。

+0

board_id索引將有所幫助,但我認爲主要問題是未索引的JOIN(分區)。 – Vatev