通过2个连接表的Mysql顺序与filesort和临时表非常慢

时间:2014-03-25 16:20:45

标签: mysql sql join sql-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

谢天谢地!

1 个答案:

答案 0 :(得分:2)

尝试在area_relations上创建以下索引:

create index idx_area_relations_board_id_id on area_relations(board_id, id)

这将允许where子句使用过滤。

您仍然坚持使用filesort,因为您按多个表中的列进行排序。