MySQL 性能 - 使用复合键加入会提高性能吗?

MySQL performance - do joining using compsite key increase performance?

我有两个 table,上面有数百万条数据。 table 都有 2 个参数,我想通过它加入那些 table。查询示例:

SELECT 
    bills.meter_id,
    records.record_id
FROM records
JOIN bills ON (
    bills.mnumber = records.mnumber
    AND bills.end_date = records.enddate
)
WHERE records.mnumber IS NOT NULL
AND records.enddate IS NOT NULL

所以你可以看到我有两个 tables recordsbills 使用 mnumberendate 字段。目前 none 这些列已编入索引。为该查询提供最佳性能的最佳索引组合是什么。 GROUP BY records.mnumber,records.enddate 对性能有帮助吗?

Will GROUP BY records.mnumber,records.enddate help performance?

GROUP BY 正在操纵您的结果集 - 这是为了聚合,而不是为了性能...

您正在 3 个选项中进行选择:

  1. 优化您的架构并制作正确的 ID,而不是加入日期字段
  2. 为日期字段添加索引
  3. 在两个字段上添加复合索引

要检查最佳效果,请在查询前使用 EXPLAIN 并比较输出(更少的查找通常意味着更好的性能)。

JOIN(但不是 LEFT JOIN)中,首先查看哪个 table 可能受益于用于过滤的索引。由于 WHERE 仅引用 records,这可能是优化器将使用的第一个 table。

WHERE records.mnumber IS NOT NULL
  AND records.enddate IS NOT NULL

可能会从 INDEX(mnumber, enddate) 中获益——无论顺序如何。这取决于 table 中有多少两列都是 NULL.

继续下一个 table (bills):

 ON bills.mnumber  = records.mnumber
AND bills.end_date = records.enddate

肯定会受益于 bills 上的这个综合指数:

INDEX(mnumber, enddate)  -- in either order

(我同意关于 GROUP BY 的另一个答案。)