为了账号安全,请及时绑定邮箱和手机立即绑定

请问这个SQL为什么不会用到索引,该怎么优化?

请问这个SQL为什么不会用到索引,该怎么优化?

慕标5832272 2019-03-01 10:44:56
现在有两张表;r和p,在r_id上有索引 SELECT * FROM p, r WHERE r.r_id= p.c_id OR r.r_id=p.p_id; 现在这个sql通过explain查看发现r表是ALL全表扫描,请问为什么不使用索引,该如何优化,谢谢诸位
查看完整描述

6 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

拆成SELECT FROM p, r WHERE r.r_id= p.c_id union SELECT FROM p, r WHERE r.r_id=p.p_id;

查看完整回答
反对 回复 2019-03-01
?
慕容森

TA贡献1853条经验 获得超18个赞

都没人看到他没有条件筛选吗? 两个表一起查,不论你怎么关联肯定要遍历数据的,这样必然会有一个表要全扫的

查看完整回答
反对 回复 2019-03-01
?
largeQ

TA贡献2039条经验 获得超7个赞

where 语句里面如果带有or条件, myisam表能用到索引, innodb不行,or必须是独立的索引

查看完整回答
反对 回复 2019-03-01
?
BIG阳

TA贡献1859条经验 获得超6个赞

SELECT * FROM  r , p WHERE r.r_id = p.c_id
UNION
SELECT * FROM  r , p WHERE r.r_id = p.p_id

对于单个查询,IN是可以命中r.r_id索引,这是由mysql查询引擎自己决定。

查看完整回答
反对 回复 2019-03-01
?
跃然一笑

TA贡献1826条经验 获得超6个赞

1.多表联合查询,需要加筛选条件才能走索引,否则第二张表会扫全表。
2.一般union all多用来替代or,比union效率高,union适用于需要去重的场合,但是如果存在全表扫,union可能效率更低。
3.有时候可能因为数据量的大小,块分布,逻辑读次数等,实际结果可能反差很大,到底用哪种更快,不是绝对的,多用explain来看一下,数据量过大的情况,可以考虑分库分表,或者缓存的方式来处理,或者将部分逻辑计算放到代码层面处理。

查看完整回答
反对 回复 2019-03-01
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

有没有试试join呢?

查看完整回答
反对 回复 2019-03-01
  • 6 回答
  • 0 关注
  • 496 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信