标签:理解 type http join 运行 命中率 直接 family table
今天心血来潮,突然想来写写当初学习mysql的一些中心点。进入重点,
Mysql其实非常重要对于学PHP的来说,因为不可能每个公司都会又DBA负责这一块(本人公司就没有,其实本人mysql也掌握的挺菜的),所以有时候要负责调优一些慢sql,以及一些表结构,这过程太酸爽了(我相信大家有深有体会了)。
要想优化一些查询语句你肯定要大概知道一条查询语句的运行历程吧(Server层),我大概画了一下(我这边随便画画的,将就一下hahaha)
!!!这里要说一下图上的查询缓存到mysql8.0之后已经被mysql停用了。
这边只会介绍Server层的东西向引擎层的就不多说了感兴趣可以自己去学习一下,图上的东西我一个一个大概说一下是啥吧
Query cache(查询缓存) :这个其实很好理解每次你新建了连接进来时候,比如说你查询过了的语句会以(Key-Value)被缓存起来, Key指的就是语句 Value就是结果,如果有相同的Key就会直接返回结果。看到这里你肯定会想这么好用为啥 8.0之后会被禁用掉了(黑人问号脸???),我以前也是这么觉得,后来了解了一下 原来每次更新后缓存就会失效,那这样缓存的命中率就太低了, 如果静态表的话那用这个还是很好的。Mysql还提供了按需缓存的功能,把配置 query_cache_type 设置为DEMAND (没记错应该是这个),然后查询的时候加上关键字就可以了,比如:”select SQL_CACHE * from student”;
语法分析器:这个其实就是字面意思,看你的查询语句是否有语法问题,如果有的话就会提示 ”You have an error in your SQL syntax“,(我刚学的时候经常报这个错,那时候在学校学的时候就是原生学的)
优化器:经历过上面的语法分析之后,就知道你要查哪个表哪个字段了,这时候优化器就很重要了,如果你查询条件有索引的话就会使用索引去查询(当然是按照一定规则,如联合索引最左原则之类的),当然它也不是全能的,不然也不需要手动优化语句了哈哈哈,接下来就是执行(差点忘了写了,执行的时候会做权限判断的,优化之前也会做precheck的,所以不用担心权限相关问题)。我这边举个优化的例子吧:
DDL:
CREATE TABLE `A` (
`id` int(10) NOT NULL,
`num` int(10) NULL,
PRIMARY KEY (`id`)
INDEX (`num`)
);
Insert into A (1,1),(1,2),(2,1),(2,2),(2,3)
CREATE TABLE `B` (
`id` int(10) NOT NULL,
`nums` int(10) NULL,
PRIMARY KEY (`id`)
INDEX (`nums`)
);
Insert into B (1,2)(1,5),(1,6)
“select A as a join B as b on `a.id`=`b.id` where a.num=2 and b.nums=6”
这条语句有两种执行过程
这两种结果虽然都是一样的但是效率就不一样了,优化器就是做这些工作的。
今天大概就写到这里了,再慢慢完善哈哈哈哈
标签:理解 type http join 运行 命中率 直接 family table
原文地址:https://www.cnblogs.com/jerrydailyphp/p/12858490.html