mysql 关系表 索引_Mysql中 一对多的关系表使用不了索引的问题

我所用到的表有两张,分别是 A表和B表。

A表

guess_id user_id

1 DD

2 CC

3 SS

B表

b_id guess_id b_name

1 1 WW

2 1 XX

3 2 RR

A表和B表的 字段的字符集等,都是相等的还有字段,排除是因为字符集或者长度等使用不了索引的关系。

guess_idvarchar64utf8mb4utf8mb4_bin

user_id varchar64utf8mb4utf8mb4_bin

A表的 guess\_id 和 B表的 guess\_id 都加了索引。

名栏位索引类型

guess_idguess_idNormal

但是

EXPLAIN select

bgo.amount amount

from block_guess bg INNER JOIN block_guess_option bgo on bg.guess_id = bgo.guess_id

where bg.user_id = '2550' and bg.type != 'COMMON' and DATEDIFF(NOW(),bg.CREATE_TIME) = 1

order by bgo.amount desc

limit 5

按照上面的sql 执行之后

![在这里插入图片描述][70]

然后换做 这样的sql 只是把 inner join 换成了 left join

EXPLAIN select

bgo.amount amount

from block_guess bg LEFT JOIN block_guess_option bgo on bg.guess_id = bgo.guess_id

where bg.user_id = '2550' and bg.type != 'COMMON' and DATEDIFF(NOW(),bg.CREATE_TIME) = 1

order by bgo.amount desc

limit 5

执行之后如图:

![在这里插入图片描述][70 1]

这样就可以用到索引了。不用全盘扫描了。初步总结,是因为表的关系的一对多,用inner join 是逐一匹配,匹配的永远是一对一,而left join 则匹配的是一对多。我是这样理解的。如果有更好的解释可以在下面告诉我。谢谢!

[70]: /images/1604820358528.png

[70 1]: /images/1604820379983.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值