0

这让我发疯,我非常努力地在 mysql 上加入 3 个表,我想要的是,选择用户订阅的所有 suscriptors,为此,我得到了这些表

user(id, nombre)
suscriptor(id, nombre)
suscripcion(id, userid, suscriptorid)

我使用的查询是这个:

select u.nombre, sr.nombre, s.suscriptorid from user u
       inner join suscripcion s on s.userid = u.id
       inner join suscriptor sr on sr.id = s.suscriptorid
where u.id = 1;

它工作正常,但是当我使用解释检查查询时,当只有一个结果时,我的意思是,当 id = 1 的用户仅订阅一个 suscriptor 时,一切对我来说都很好,因为扫描的总行数是 1 * 1 * 1.问题是当用户订阅了多个订阅者时,导致显示:

表 u(user) 中的行为 1,类型为 const,
表 s(suscripcion) 中的行为 1,类型为 ref,
表 sr(suscriptor) 中的行为 5(总行数),类型全部为

我尝试过这些类型的索引组合:

  • 在表 suscripcion 中:索引 UI(userid) 和索引 SI(suscriptorid)

并且似乎只使用其中一个索引,并不断扫描表 suscriptor 中的所有结果

  • 我什至尝试过使用复合索引:索引 USI(userid, suscriptorid) 但再次忽略第二个索引并扫描表 suscriptor 中的所有行。

感谢提前。

4

1 回答 1

1

如果您只有 5 行,则查询计划程序不会使用索引,因为读取所有 5 行比使用索引更快。尝试使用几百行进行测试。您还可以建议索引以查看它是否完全符合条件

于 2013-05-05T22:16:38.260 回答