【问题标题】:mysql explain and inner join not working as expected for me at leastmysql 解释和内部连接至少对我来说没有按预期工作
【发布时间】:2013-04-29 15:58:23
【问题描述】:

这让我发疯,我非常努力地在 mysql 上与 3 个表进行连接,我想要的是选择用户订阅的所有下标,为此,我得到了这个表

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 的用户只订阅一个下标时,一切对我来说都很好,因为扫描的总行数是1 * 1 * 1. 问题是当用户订阅多个订阅者时,会显示:

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

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

  • 在表格中: 索引 UI(用户 ID)和 指数 SI(下标)

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

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

感谢提前。

【问题讨论】:

    标签: mysql join indexing explain


    【解决方案1】:

    如果您只有 5 行,则查询规划器不会使用索引,因为读取所有 5 行比使用索引更快。尝试使用几百行进行测试。你也可以suggest index to see if it's eligible at all

    【讨论】:

    • 天哪,我简直不敢相信,非常感谢您的回答,我已经在表格中填满了数据,而且看起来效果很好,再次感谢,我去看看链接。
    猜你喜欢
    • 1970-01-01
    • 2016-03-15
    • 2016-11-28
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多