【发布时间】:2017-05-13 05:09:24
【问题描述】:
如果我的查询看起来像:
SELECT *
FROM member
LEFT JOIN group ON (member.group_id = group.id)
WHERE group.created > @date
ORDER BY member.last_updated
如果我为以下各项创建两个索引:
member.group_id, member.last_updated
group.id, group.created
这是优化原始查询的最佳方法吗?我应该添加一个新字段member.group_created 并像这样索引:
member.group_created, member.last_updated
【问题讨论】:
-
我建议使用 EXPLAIN 语句 dev.mysql.com/doc/refman/5.7/en/explain.html 检查这两种情况,然后查看。
-
我敢打赌,添加 member.group_created 将没有多大用处,也不会加快您的查询速度。为方便起见,您正在打破 3NF。优化器将正确使用 group.created 上的索引。如果您打算做任何事情来加快速度,请测试在 member.last_updated 上添加非聚集索引
-
只需创建两个单独的索引-->1.member.group_id 2.group.created,我认为'group'表中的'id'将是主键,不需要索引,因为primarys会默认在mysql中索引
-
很好,我可以从第二个索引中排除
group.id,但这并不能解决member.last_updated对结果排序的优化问题。也许这不是必需的,因为我们将扫描与member匹配的所有结果,因此索引不会大幅提高性能?但是,如果这是我们有兴趣通过member.group_id查询的唯一查询,那么将member.last_updated添加到索引中的开销是最小的,不是吗? -
请注意,group 是一个保留字,因此对于表标识符来说不是理想的选择