mysql索引优化

优化建议:

1。当使用索引的时候,尽量不要使用表达式,把计算放在业务层,而不是数据库层。

2。 尽量使用主键查询,而不是其他索引,因为 其他索引会触发回表。

3。union all,in,or 都可以使用索引,但是推荐使用in。

4。排序的时候使用索引来排序。如果是组合索引,排序也遵循最左匹配原则。

5。强制类型转换会导致索引失效。比如查字段 phone=''的时候,把where phone='123958475' 写成where phone=12123958475,数据库phone字段是字符串,但是sql写成了int ,mysql会进行隐式转换,从而导致全表扫描。

6。当需要表连接的时候,最好不要超过3张表,因为需要join的字段,数据类型必须一致。

7。能使用limit的时候尽量使用limit。(不是为了分页,是未了限制输出,分页只是其中一个用途。)

8.单索引字段不允许超过5个(组合索引)。

9.创建索引应避免以下错误观念: 1索引越多越好。2,过早优化,或在不了解系统的情况下进行优化。

 

一.组合索引:

  假如有张表 abc ,有字段a(int),b(int),c(int), 且存在索引 index_abc(a,b,c) ;

有另外一张表 abc2 ,有字段a(int),b(int),c(int),name(varchar) 且存在索引 index_abc2(a,b,c) ;

1. 组合索引的 or条件判断是否会走索引: 不一定! 主要看优化器是否做了处理!

如果是单列索引,or会使用索引;

如果是组合索引,分情况: 1,全部的列都是组合索引,会使用全部列对应的索引(不包含中间某列是范围查询的列)。2,如果部分列是组合索引,那么不会走索引。

select * from abc where  a=3 or b=4; ---会走索引          why? 因为abc表的组合索引字段(a,b,c)为全表所有字段,走的全表索引,这是一种特殊情况,一般生产环境不会这样建表。

select * from abc2 where a=3 or b=4;  ---不会走索引     why? 因为abc2表的组合索引不是全表的所有字段(正常都是这样,组合索引都是表的部分字段),此时or不会走索引

select a ,b from abc2 where a=3 or b=4 ---会走索引   why? 因为查询的abc2的表字段(索引字段)和where的查询条件相匹配。

注意:上面说的情况都是复合索引,如果查询列和where条件列 是单列索引,or也会生效;

如: select id from user where id=1 or id=2;

 

2最左匹配判断: 用表abc2举例,因为表abc情况不实际。

参考索引桥 如下图:

select * from abc2 where a=3 and b=4 and c=5;             -------会,a,b,c

sleect * from abc2 where a=3 and c=5 and b=4;             -------会,a,b,c 优化器调优了。

select * from abc2 where a=3 and c=4;                           -------会 ,但是只有a

select * from abc2 where a=3 and b=4;                           -------会 ,但是只有a,b

select * from abc2 where a=3 and b>7 and c=4;             -------会 ,但是只有a,b

select * from abc2 where a=3 and b like %7% and c=4   -------会 ,但是只有a

select * from abc2 where b=3 and c=4;                            -------不会 

select * from abc2 where b=3 or c=4;                                ------不会,但是用abc表这种特例会。

 

3.名词说明:

覆盖索引: 查询的列为表的索引(主键索引,唯一索引,普通索引),就会走覆盖索引。优点:减少了回表操作,即减少了磁盘IO操作,提高了查询效率。

如: select a from abc2 where a=2;

回表: 二级索引(普通索引)无法直接查询所有列的数据,所以通过二级索引查询到聚簇索引(主键索引)后,再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。需要经过至少2次磁盘IO。

索引下推: mysql5.6之后才出现,把组合索引的匹配的列全部通过存储引擎层做筛选,省去了server层的计算。

 

索引监控:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值