mysql查询性能优化

查询执行路径

在实际开发中,一些数据对实时性要求特别高,或者并不经常使用(可能几天就执行一次或两次),这样就需要把缓冲关了,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找该数据,每次都会从磁盘中读取。因为如果实时性要求特别高,缓存中数据可能和磁盘中的就不同步,如果数据不经常使用,被缓存起来,就会占用内存。 在my.ini中的query_cache_type,使用来控制表缓存的。

这个变量有三个取值:0,1,2,分别代表了off、on、demand。 0:表示query cache 是关闭。 1:表示查询总是先到查询缓存中查找,即使用了SQL_NO_CACHE仍然查询缓存,它只是不缓存查询结果而不是不使用查询结果。 2:表示只有在使用了SQL_CACHE后,才先从缓冲中查询数据,仍然将查询结果缓存起来

通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以认为是整个生命周期最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。 解析树将使用MySQL语法规则验证和解析查询。例如,他将验证是否使用错误的关键字,或者使用关键字的顺序是否正确,在或者它还会验证引号是否前后正确匹配。 预处理器则根据一些MySQL规则进一步检查解析树是否合法。例如,这里将检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。

查询语句执行顺序

(1)  from (3)  join (2)  on (4)  where (5)  group by (6)  avg,sum.... (7)  having (8)  select (9)  distinct (10) order by (11) top

SELECT `user`.tenant_id,`tenant`.code,count(1) FROM `user` LEFT JOIN `tenant` ON `user`.tenant_id = `tenant`.id
WHERE  tenant_id IS NOT NULL   GROUP BY tenant_id
HAVING count(1) >= 10
ORDER BY tenant_id DESC;

所有的查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。

第一步:首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表 vt1(选择相对小的表做

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值