【问题标题】:Mysql order by from 2 joined tables very slow with filesort and temporary tableMysql 从 2 个连接表中排序,文件排序和临时表非常慢
【发布时间】:2014-03-25 16:20:44
【问题描述】:

我不知道如何优化此查询并摆脱临时表和文件排序。我尝试添加这么多索引但没有运气,我已经为这个问题将它们全部剥离,因为我真的不知道从哪里开始。

我的问题是,如果除了添加索引之外我无法更改表结构或数据,我该如何尽可能优化此查询。我可以更改查询本身。每个表包含大约 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

谢谢!

【问题讨论】:

  • 您确定此查询计划适用于您发布的表结构吗?你也可以制作一个复制它的fiddle吗?

标签: mysql sql join sql-order-by


【解决方案1】:

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

create index idx_area_relations_board_id_id on area_relations(board_id, id)

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

你被文件排序卡住了,因为你是从多个表中按列排序的。

【讨论】:

  • board_id 索引会有所帮助,但我认为主要问题是非索引 JOIN(分区)。
猜你喜欢
  • 2016-03-12
  • 2016-11-29
  • 2018-12-05
  • 2016-09-04
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 2012-07-16
  • 2023-04-06
相关资源
最近更新 更多