1

该查询很慢(大约 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 | |

表帖子有数百万个条目,主题大约有 500k。

两个表上的 cid 和 id 都是主组合键。cid 表示社区 ID。这些表格承载了许多不同的论坛。

感谢您在加快这件事上提供的任何帮助。

4

2 回答 2

1

当加入多个字段(使用 AND)时,在这些字段上建立一个复合索引会有所帮助。

在您的情况下,您可以将cid帖子中的索引更改为(cid, container),这样 mysql 将能够直接查找行(您仍然可以将它用于只有cid条件的查询)。

此外,您可能应该将其设为 INNER JOIN(如@AndrewK 所述),以提高可读性。

于 2013-08-09T14:58:46.100 回答
0

只需查看您的查询,您就可以简化它。

由于您将集合减少到 t.cid = 1010699 的位置,因此您声明它不能下注为空。所以你可以使用内部连接。

SELECT SQL_NO_CACHE p.id 
FROM 1_posts p 
JOIN 1_topics t ON p.container = t.id 
WHERE t.cid = 1010699 AND p.cid = t.cid;

编辑:

正如 Vatev 指出的那样,删除 p.cid = t.cid 确实会改变查询的结果。为了便于阅读,我将其添加回 WHERE 子句

于 2013-08-09T14:28:45.157 回答