2

我有两个名为 1 的表。表 A - 具有多个列,主键为 user_id (900,000+ 条记录) 2. 表 B - 具有称为 user_id 的单列(900+ 条记录)

表 A 包含表 B 的所有 user_id 等等。我需要通过 user_id 获取匹配 A、B 行的 * 列列表。我正在使用下面的查询,它已经在我的 p4 机器上运行了 1 个小时,CPU 为 100%,但看不到任何结果。

SELECT a.* FROM tableA AS a INNER JOIN tableB AS b ON a.user_id = b.user_id;

有没有办法使查询执行快速?

4

1 回答 1

1

首先确保两者tableA和在其字段tableB上都有索引。user_id


如果标准技术没有帮助,您可以使用以下命令强制 MySQL 以不同的顺序连接这两个表STRAIGHT_JOIN

SELECT a.*
FROM          tableB AS b /* first process the 900 rows */
STRAIGHT_JOIN tableA AS a /* and find matching rows for every tableB row */
           USING user_id; /* BTW, you could use USING here :) */

http://dev.mysql.com/doc/refman/5.0/en/join.html

STRAIGHT_JOIN 与 JOIN 类似,只是左表总是在右表之前读取。这可用于连接优化器以错误顺序放置表的那些(少数)情况。

其他信息:http ://dev.mysql.com/doc/refman/5.0/en/left-join-optimization.html

... LEFT JOIN 或 STRAIGHT_JOIN 强制的表读取顺序 ...

对于 LEFT JOIN,如果生成的 NULL 行的 WHERE 条件始终为假,则将 LEFT JOIN 更改为普通连接。

于 2012-08-05T08:44:49.827 回答