【问题标题】:How to make an inner join efficient mysql如何使内部连接有效的mysql
【发布时间】:2012-08-02 15:21:17
【问题描述】:

我有两张桌子叫 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;

有没有办法让查询执行得更快?

【问题讨论】:

    标签: mysql performance inner-join


    【解决方案1】:

    首先确保tableAtableB 在其user_id 字段上都有索引。


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

    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,如果 WHERE 条件对于 生成 NULL 行,LEFT JOIN 改为普通连接。

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2012-12-13
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多