mysql 查询两字段之差 索引_mysql 为什么多查询几个字段就不使用索引了?

索引:

Inoodb 表

结构

id dtEventTime iType iMoney iAction

时间 类型 金钱 动作

在 where 的两列上都有索引

alter table costmoney add Index test(dtEventTime,iType)

SQl

EXPLAIN select count(*) from CostMoney WHERE dtEventTime BETWEEN '2012-10-09' AND '2012-10-10' AND iType =3

显示结果

99e0f5336e60f66e14e245722f763c23.png

进行count 查询, 显示没问题

但是如果我步count , 查询几个字段的值, 就不会索引, 就全表扫描了

EXPLAIN SELECT iMoney,iAction FROM CostMoney WHERE dtEventTime BETWEEN '2012-10-09' AND '2012-10-10' AND iType =3

3856ccf17b2accfebc3f68e0982b9053.png

”问题补充

其实我是想要 这个sql 语句的 结果

不同的动作下面钱的总和”**

SELECT iAction FROM CostMoney WHERE  dtEventTime BETWEEN  '2012-10-09' AND  '2012-10-10' AND iType =3  group by iAction

动作1 100 元

动作2 200 元

这样的结果 , 这个索引怎么加比较合理呢 ?

这个问题涉及到“覆盖索引”这个概念。你第一个查询是查count(*),实际上值需要使用索引test,就能完全得到结果,不需要回聚簇索引查其他字段,因此InnoDB认为用这个所以比全表扫描快。

而第二个查询因为要访问iMoney,需要“回表”,用不上覆盖索引。

另外一个原因是索引字段的顺序,如果你把 test定义为(iType, dtEventTime), 这个查询应该就能用上test这个索引。而现在字段顺序会导致你这个查询,即使要用这个索引,也只能用到第一个字段。这个explain结果说明InnoDB觉得这个字段的过滤效果不好,不如全表扫描。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值