mysql 最左索引

最近用索引时发现,聚合索引的使用顺用与索引的生效息息相关,我这是好久不用数据库了,表示都忘关了,今天才发现这个严重的问题,记录下吧。

以下场景使用tbl_detail表作为例子。

表中经常使用的字段是,tradedetail_id、pay_status、parnter_id,如果单独给这三个字段建立索引,比如以下sql:

select * from tbl_detail where tradedetail_id=1010;

select * from tbl_detail where pay_status='00';

select * from tbl_detail where parnter_id=1000;

如果在tradedetail_id上在增加pay_status索引这个,这个时候使用聚合索引(tradedetail_id,pay_status),

但如果是

select * from tbl_detail where tradedetail_id=1010 and pay_status='00';

这个时候使用单个索引与聚合索引的执行过程就是不一样的了,

使用单独的两个索引执行过程:在第一个索引查询的集合s1中在执行第二个索引的查询

使用聚合索引则是执行一个联合索引查询

针对聚合索引生效的索引是

(tradedetail_id)

(tradedetail_id,pay_status)

(tradedetail_id,pay_status,parnter_id)

举例:

select * from tbl_detail where tradedetail_id=1010 and pay_status='00'; 走索引(tradedetail_id,pay_status);

select * from tbl_detail where tradedetail_id=1010 and parnter_id=1000; 只走tradedetail_id索引,不走partner_id索引;

select * from tbl_detail where tradedetail_id=1010 and parnter_id=1000 and pay_status='00'; 

select * from tbl_detail where tradedetail_id=1010 aand pay_status='00' nd parnter_id=1000 

上面两条语句,效果是一样样的,走索引(tradedetail_id,pay_status,parnter_id) 


下面是分析语句的执行情况,在sql语句中使用关键字 explain 即可查看语句执行情况,每个字段的属性含义不在复述,大家可以去网上查找下资料



补充下索引的相关知识

索引失效的情况:
对于多列索引,不是使用的第一部分,则不会使用索引
or关键字、like查询以“%”开头
查询参数的字段类型,比如查询参数是数字类型,却使用了引号,这会导致索引失效
对索引列进行运算时,会导致索引失效,运算符包括(+、-、/、* 、!等)(后期还会在继续补充)

在索引存在插入数据跟没有索引插入数据相比较,有索引插入数据更慢些,下面使用存储过程完成的测试,从数据上看确实没有太大的差距,不知在实际程序上会不会有更慢的性能问题

没有索引的情况


索引存在的情况



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值