mysql查询性能优化

查询执行路径

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

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

mysql查询性能优化_第1张图片

通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以认为是整个生命周期最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。 解析树将使用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开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表ÿ

你可能感兴趣的:(sql)