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 records 和 bills 使用 mnumber 和 endate 字段。目前 none 这些列已编入索引。为该查询提供最佳性能的最佳索引组合是什么。 GROUP BY records.mnumber,records.enddate
对性能有帮助吗?
Will GROUP BY records.mnumber,records.enddate help performance?
GROUP BY
正在操纵您的结果集 - 这是为了聚合,而不是为了性能...
您正在 3 个选项中进行选择:
- 优化您的架构并制作正确的 ID,而不是加入日期字段
- 为日期字段添加索引
- 在两个字段上添加复合索引
要检查最佳效果,请在查询前使用 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
的另一个答案。)
我有两个 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 records 和 bills 使用 mnumber 和 endate 字段。目前 none 这些列已编入索引。为该查询提供最佳性能的最佳索引组合是什么。 GROUP BY records.mnumber,records.enddate
对性能有帮助吗?
Will GROUP BY records.mnumber,records.enddate help performance?
GROUP BY
正在操纵您的结果集 - 这是为了聚合,而不是为了性能...
您正在 3 个选项中进行选择:
- 优化您的架构并制作正确的 ID,而不是加入日期字段
- 为日期字段添加索引
- 在两个字段上添加复合索引
要检查最佳效果,请在查询前使用 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
的另一个答案。)