首页新闻找找看学习计划

数据库索引问题

0
悬赏园豆:10 [待解决问题]
  1. 数据库的联合索引都知道有一个最左匹配原则,比如有一个联合索引ab,查询的时候只有a或者ab顺序能用到索引,其他的用不到,但我自己explain sql语句,发现如果where条件后只有b也能用到这个联合索引,比如select * from table where b = ? 没有用到ab索引,但是select b from table where b = ? 为什么却用到了索引?
  2. 如果只是给一个字段a加索引,select * from table where a = ? 为什么使用不同的参数查询,有的用到索引a,有的却用不到?
问题补充:

字段a:varchar(32),非空,默认''

字段b: varchar(32),非空,默认''

青木年华的主页 青木年华 | 初学一级 | 园豆:133
提问于:2018-01-23 16:04
< >
分享
所有回答(1)
1

你贴一下你的表结构,索引信息,数据量大小

Daniel Cai | 园豆:10374 (专家六级) | 2018-01-23 16:19

字段a:varchar(32),非空,默认''

字段b: varchar(32),非空,默认''

数据量现在还不多,几十条而已

支持(0) 反对(0) 青木年华 | 园豆:133 (初学一级) | 2018-01-23 16:23

@青木年华: 索引呢?而且十几条数据这个db不一定会用索引,全表扫这块开销会比走索引要快

支持(0) 反对(0) Daniel Cai | 园豆:10374 (专家六级) | 2018-01-23 17:43

@Daniel Cai: 嗯,第一种情况就是给ab建联合索引,第2种是给a建索引,但是同样是这么多数据,第2种情况有的用到索引有的用不到(⊙o⊙)

支持(0) 反对(0) 青木年华 | 园豆:133 (初学一级) | 2018-01-25 20:28

@青木年华: mysql的索引结构不太熟悉,但我估计如下

关于问题1你说条件只有b却走了索引,这个应该不可能,建议你再确认下

问题2你最好把数据量放大,太少的数据走索引还要从索引过一遍再找数据行,如果引擎聪明点很可能会放弃这种看似更好的方案(直接扫表开销更低)。另你需要确认下你a的分布情况,如果大部分a字段都是同一个值而你却又刚好用这个值来查询估计很大可能性db会选择扫表,相反可能会选择索引

支持(0) 反对(0) Daniel Cai | 园豆:10374 (专家六级) | 2018-01-25 21:16

@Daniel Cai: 第一种情况我试过了,我也觉得很奇怪,但explain sql语句,它就是用到了索引(⊙o⊙)

支持(0) 反对(0) 青木年华 | 园豆:133 (初学一级) | 2018-01-29 20:29

@青木年华: 你把你explain出来的结果铁出来看看

支持(0) 反对(0) Daniel Cai | 园豆:10374 (专家六级) | 2018-01-29 22:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册