sql优化(结论,mysql)

目录

一、关联查询,主表的选择(Mysql优化器会进行优化)

1、where条件没有命中索引(可针对主表建对应的索引)

1.1、A,B表数据量相同(不走索引)

1.2、A,B表数据量不相同(不走索引)

2、where条件命中索引

二、辨识度低的字段不适合建索引

三、联合主键索引

四、order by排序

1、A字段有索引,B字段没有索引

2、A字段有索引,B和C字段没有索引

3、A和B为联合索引(A前B后)

五、范围查询(大于/小于/区间)

六、回表

1、where条件没有命中索引

2、where条件命中主键索引

3、where条件命中索引

七、冗余字段


一、关联查询,主表的选择(Mysql优化器会进行优化)

备注:主表进行全表扫描,然后通过主键再找到其他表的数据,所以其他表会走主键索引(这里是用主键做关联查询)

1、where条件没有命中索引(可针对主表建对应的索引)

1.1、A,B表数据量相同(不走索引)

如果主键一样,则第一个表进行全表扫描,第二个表走主键索引

如果有联合主键,则有联合主键的表进行全表扫描,另一个表走主键索引

1.2、A,B表数据量不相同(不走索引)

如果主键一样,则数据量少的表进行全表扫描,数据量多的表走主键索引

如果有联合主键,也是数据量少的表进行全表扫描,数据量多的表走主键索引

 

2、where条件命中索引

如果where条件中有命中索引,则把索引所属的表当成主表,另一个表用主键索引【主表是全表扫描的,可以通过索引,让主表走索引避免全表扫描】

 

二、辨识度低的字段不适合建索引

辨识度低的字段,例如性别,只有男、女、其他,查询 性别=男 的时候,能够匹配到的数据量太大,数据库优化器认为全表扫描会效率高,所以不会走索引

 

三、联合主键索引

表中A和B为联合主键(A在前,B在后),当where条件中,只用一个主键字段做条件查询时,会遵循最左匹配原则【类似于like ‘xxx%’,%不在前面才会走索引,扫描B+树,定位到大概的范围进行搜索】

例如:

SELECT * FROM table WHERE A = xxx; //会走主键,遵循最左匹配原则

SELECT * FROM table WHERE B = xxx; //不会走主键,因为需要先匹配到前面A,才能知道B的位置,可自行百度B+树是怎么找数据的

 

四、order by排序

order by排序的字段需要是where中命中索引的字段,才能利用索引的有序性,不用再进行外部排序(order by没有利用索引的有序性,会把数据放到内存中进行排序处理,如果内存不够,则有一部分会先放在磁盘上再排序&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值