查询性能优化

1.慢查询基础:优化数据访问

      1.确认应用程序是否检索大量超过需求的数据。

      2.确认mysql服务器是否在分析超过需要的数据。


1.1是否向数据库请求了不需要的数据

      如果需要一部分数据就加上limit,多表关联时不要select *,取出自己需要的数据。

1.2mysql是否扫描额外的数据

    衡量查询开销有三个指标:响应时间,扫描的行数,返回的行数。

    一般情况下,mysql如下三种方式应用where条件,从好到坏

     1.索引中使用where条件过滤不匹配的信息。

     2.使用索引覆盖扫描来返回记录

     3.从数据库中返回数据,然后过滤。


如果发现扫描大量的数据但是只返回很少的行:

1.使用索引覆盖扫描,把所有需要的列放到索引中。

2.改变库表结构

3.重写复杂的查询


2.1一个复杂查询还是多个简单查询

     有时候一个复杂查询能完成就不用分成多个查询。看效率怎么样。

2.2切分查询

     把复杂查询切成小查询,功能完全一样,只是每次执行一部分,例如删除,每次加limit 10000这样,重复多次。

2.3分解关联查询

    把多个关联查询分成多个的好处:

    1.让缓存效率更高

    2.分解后可以减少锁的竞争

    3.查询本身的效率也有可能提升

    4.可以减少冗余记录的产生。


3.查询执行基础

    


1.查询缓存

      解析一个语句前要先看查询缓存是否打开,如果打开,mysql会检查这个查询语句是否命中查询缓存的数据,这个检查是通过大小写敏感的哈希查找实现的,只要有一个字节不同就不匹配。

     如果查询命中了查询缓存,那么 mysql在返回查询结果之前会先检查一次用户权限,如果权限没有问题就直接返回结果。

2.查询优化处理

     mysql通过关键字对sql语句进行解析,并生成一课解析树。mysql解析器将使用mysql语法规则验证和解析查询。预处理器就是进一步检查解析树是否合法。然后预处理器会验证权限。现在语法树是合法的了,并且优化器将它转为最好的执行计划。

    优化器的策略有两种:静态优化和动态优化。静态优化是直接对解析树进行分析,并完成优化。不依赖与特别的数值,在第一次完成后就一直有效。可以认为是编译器优化。动态查询是和查询的上下文有关,也可能和其他东西有关,每次查询需要重新评估。

     一些mysql能够处理的优化类型:

     1.重新定义关联表的顺序:数据库表的关联并不总是按照查询中指定的顺序进行。

     2.将外链接转为内连接:并不知所有的outer join都已外连接方式进行。

     3.使用等价变换规则。

      等等


优化特定类型的查询

 1.count()的作用:统计某个列值的数量(不能为null),如果在括号中指定了列或列的表达式,统计的是这个列有值的表达式。还有一种就是count(*)统计行数。

2.优化关联查询

    1.确保on或using子句中的列上有索引

    2.确保任何group by和order by的表达式只涉及一个表的列

3.优化group by和distinct

    使用索引来优化是最有效的。

    mysql无法使用索引的时候,group by使用两种策略来完成,使用临时表或者文件排序来分组。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值