mysql优化

先说一下数据库操作数据的过程,客户端先跟数据库建立连接,然后去数据库查询数据,数据库会先查询缓存,如果缓存中有相应的数据,就直接返回结果,如果没有,就会经过分析器,优化器,执行器,然后去存储引擎中查找数据,最后再将查询到的数据返回。所以我们对mysql的优化是在执行器执行之前的分析器和优化器。
分析器就是分析sql语句中的符号,字段都是干嘛的,优化器就是对sql语句进行优化。

explain

mysql优化肯定都会想到先用explain看一下执行计划,看是否跟自己预期的一样,是否有没有用到预期的索引,但是要注意:

  • explain计算出来的rows并不一定是准确的,InnoDB存储引擎会默认选择n个页,然后计算这几个数值,得到一个平均值,再用这个平均值跟页数相乘得到一个基值,而且我们的数据是不断变化的,这个基值也是会变的;
  • 走的索引并不一定是最优的索引,优化器会考虑到很多因素,比如如果走A索引需要查询100条数据,走B索引需要查询20条数据,但是考虑到B索引还会进行回表查询,所以就选择走了A索引,就选错了;
  • 如果统计的信息出错,可以用analyze table tablename 重新统计一下,如果没有走正确索引,可以force index强制走索引,实在不行,就删除索引再重建新索引。

聚簇索引

使用聚簇索引可以不用再回表查询,可以提高性能。InnoDB存储引擎会默认给主键建立聚簇索引,如果没有主键,就会选一个唯一键建立聚簇索引,如果没有唯一键,就自动生成一个键来建立索引。

覆盖索引

如果查询的字段全都建立了索引,也就不用再回表查询,可以提高性能。

联合索引

也是同样的原理,查询的字段都建立了索引,就不用再回表查询,但是在使用联合索引的时候要注意字段的顺序要和建立联合索引的顺序一致,否则就不走索引。

最左匹配

要充分利用当前建立的索引,注意查询字段中的索引顺序,在匹配过程中遇到范围查询就停止,在之后的索引就用不上了。

索引下推

在索引遍历的过程中,会对索引中的字段进行判断,会直接过滤掉不符合条件的结果,可以减少回表查询的次数。

唯一索引和普通索引的选择

  • 这就需要提到change buffer了,当我们需要对某个内存页进行操作的时候,如果该内存页在内存中,就可以直接操作了,如果没有在内存中,在不影响数据一致性的前提下,将对该数据页的操作先放在change buffer中,等下次将该数据页load到内存中,再对这个内存页进行操作。对于唯一索引,因为要保证唯一性,所以每次都会判断是否有相同的字段,也就没有必要使用change buffer了,本来也就只有普通索引使用change buffer。
  • 所以对于唯一索引和普通索引的选择,也就是change buffer的使用场景了。merge的过程是对数据真正进行更新的过程,change buffer的主要作用就是将对数据的更新操作缓存了起来,在下次merge之前,change buffer里面保存的数据越多,取得效益也就更多,可以减少 io操作次数。change buffef适用于写多读少的场景,在写完数据后被立马读到的概率比较小。

前缀索引

如果某个字段比较长,可以截取一部分来建立索引,在截取的部分中,区分度要高,这样可以筛选出较多的数据,而且截取后占用的内存变少,在一次io中,内存页可以读取更多的数据。

条件字段函数操作

在查询时,如果对索引字段使用了函数,就不会走索引。

隐式字符编码转换

也是会造成索引失效,比如select * from student where id=1如果id是字符类型,1是整型,就会隐式转换,也就不走索引了。

建立索引

  • 在建立索引的字段中尽量不要有null,null值处理起来很麻烦;
  • 建立索引的字段区分度要高,重复的个数尽量少;
  • 尽量扩展索引,不要建立新的索引;
  • 在查询时,将高选择性的字段放在前面,这样一开始就能过滤掉更多的数据;
  • 如果知道结果的个数,可以加个limit来进行限制,这样一查到足够的个数就会退出,就不会已经获取到足够的结果了还会继续遍历整张表。

where

  • 不要使用null;
  • 不要使用!=<>
  • 用exists代替in;
  • 注意如果以通配符开头就会造成索引失效。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值