【发布时间】:2013-08-09 23:30:19
【问题描述】:
该查询很慢(大约 1.5 秒)。它应该只返回一个帖子列表
SELECT SQL_NO_CACHE p.id FROM 1_posts p 左连接 1_topics t ON (p.cid = t.cid AND p.container = t.id) 其中 t.cid = 1010699;解释给出:
+----+-------------+--------+------+--------------- --------+------------+---------+---------------+--- ---+--------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+------+--------------- --------+------------+---------+---------------+--- ---+--------------+ | 1 |简单 |吨 |参考 |初级,cid |西德 | 4 |常量 | 216 |使用哪里;使用索引 | | 1 |简单 | p |参考 | PRIMARY,cid,container |集装箱 | 4 | forumdb.t.id | 49 |使用位置 | +----+-------------+--------+------+--------------- --------+------------+---------+---------------+--- ---+--------------+请注意,SQL_NO_CACHE 仅用于测试目的。
表的部分结构:
1_posts:
mysql> 解释 1_posts; +----------------+------------------------+------+-- ---+---------+----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +----------------+------------------------+------+-- ---+---------+----------------+ |西德 | int(20) 无符号 |否 |优先级 | 0 | | |编号 | int(20) 无符号 |否 |优先级 |空 |自动增量 | |集装箱 | int(20) 无符号 |否 |穆尔 | 0 | | mysql>解释1_topics; +-----------------+----------+------+- ----+---------+----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-----------------+----------+------+- ----+---------+----------------+ |西德 | int(10) 无符号 |否 |优先级 | 0 | | |编号 | int(10) 无符号 |否 |优先级 |空 |自动增量 | |集装箱 |整数(20) |否 |穆尔 | 0 | |表格帖子有数百万条条目,主题约 50 万。
cid 和 id,在两个表上都是主组合键。 cid 表示社区 ID。这些表格承载了许多不同的论坛。
感谢您在加快这方面的速度方面提供的任何帮助。
【问题讨论】:
-
您确定解释计划来自该查询吗?我不明白为什么会有
Using temporary; Using filesort。 -
乍一看,最出乎意料的是查询花了这么长时间。即使表 post 中有 500k 条目,根据查询执行计划,通过使用您的索引,MySQL 只需检查几百行。您是独自在“测试”数据库上 - 还是在实时系统上运行该查询并同时访问您的表?
-
@SylvainLeroux 原因可能是整体服务器负载,但也可能是
t.cid = 1010699是一个边缘情况,它的行数比平均数多得多(这说明显示)。跨度> -
已编辑:解释错误。添加了正确的解释输出。
-
这就是为什么我不明白为什么查询需要这么长时间。也许组合索引是问题?
标签: mysql optimization join query-optimization