数据库索引优化

1.索引覆盖

现象:在利用二级索引查询时,只能查询到主键值,然后需要再查询主键索引树,才能得到对应行数据.

原因:可以减少回表的次数,提高查询性能.

应用:建立联合索引

eg:

select name from table where id_card between 10 and 15;//id_card为普通索引.

优化:建立联合索引(id_card,name)

2.在建立联合索引的时候,如何安排索引内的字段顺序?

频繁查询的字段在联合索引中应该尽量靠左设计,能少维护一个索引是一个.

3.在建立联合索引的时候,如果需要对单个索引字段进行查询,该如何设计?

eg:有联合索引(a,b),但还需要查询单独基于a或b进行查询.因基于b进行查询时,是不能利用索引(a,b)的.故此时需要按照a和b谁的字段小谁就再单独建一个索引.若b的字段比a小,就建立(a,b),(b)两个索引.

3.索引下推(Index Condition Pushdown,ICP) 

3.1mysqlv5.6之后引入ICP

3.2在使用联合索引的时候,按照最左匹配原则没有匹配到的字段该怎麼办?如以下情况:

前提:建立了联合索引(name,age)

select name from table where name like '李%' and age = 10 ans ismale = true;

因mysql 会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。范围列可以用到索引,但是范围列后面的列无法用到索引。即,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引.

故此时根据 name like '李%' 可以利用索引,找到第一个name以李开头的记录(记作ID4),避免全表查询.然后判断其他条件是否满足。

mysqlv5.6之前:

age字段不能利用索引,只能从 ID4 开始一个个回表。到主键索引上找出数据行,再对比字段(age和iamale)值.

mysqlv5.6之后:

age字段能利用索引, 可以在索引遍历过程中,对索引中包含的字段(age)先做判断,直接过滤掉不满足条件的记录,减少回表次数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值