我无法弄清楚如何优化此查询并删除临时表和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 :(得分:2)
尝试在area_relations
上创建以下索引:
create index idx_area_relations_board_id_id on area_relations(board_id, id)
这将允许where
子句使用过滤。
您仍然坚持使用filesort,因为您按多个表中的列进行排序。