-
Mysql架构
InnoDB跟MyISAM的区别( V5.1之前默认存储引擎是MyISAM;在此之后默认存储引擎是InnoDB )
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
- 连接层:主要负责数据库的链接
- 服务层:大多数MySQL的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有内置函数(例如,日期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等
-
连接器:在你第一次连接mysql的时候就是要跟通过连接器,连接器负责跟客户端建立连接、获取权限、维持和管理连接。
-
查询缓存(caches):
MySQL 执行一个查询时,会先到查询缓存里看看,之前是不是查过这个数据,如果有的话就直接在缓存里面取(查询过的数据会以KV键值对形式存在缓存里),不过当每次更新表字段的时候,这个表的缓存就会全部失效。所以花费很大空间去存缓存是很不划算的,在MySQL8.0版本已经将这个查询缓存的整个功能都移除掉了。 -
解析器(parser)
解析sql查询语句是否有问题。首先会把我们的写的sql语句转换成mysql内部引擎可识别的语句,然后再根据规则判断该语法是否正确,如果不行的话就直接报
[SQL]selec * from test
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selec * from test' at line 1
- 优化器(opyimizer):当有多个索引时,帮我们自动选择最优索引,并且自动优化链接的join
select * from test1 t1 join test2 t2 where t1.id=3 and t2.id = 4
例如这条语句有两种方法:
(1)先join两表再判断 t1.id=3 and t2.id = 4
(2)先判断 t1.id=3 and t2.id = 4再join两表
两个结果虽然是一样的,不过执行效率差非常多,
- 执行器
select * from test1 where id = 10
执行开始之前,会先判断是否有操作权限,若没有,会抛出相关异常。
SELECT command denied to user ‘root’@’jock-x-pc’ for table ‘user’
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
比如我们这个例子中的表 test1中,ID 字段没有索引,那么执行器的执行流程是这样的:
1、调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
2、调用引擎接口取下一行,重复相同的判断逻辑,直到取到这个表的最后一行。
3、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
至此,这个语句就执行完成了。
对于有索引的表,执行的逻辑也差不多。第一次调用的是取满足条件的第一行这个接口,之后循环取满足条件的下一行这个接口,这些接口都是引擎中已经定义好的。
可以看出,是否有索引,执行效率区别还是很大的,没有索引需要取出所有数据,一个个进行比较;而有索引则是直接取满足条件的数据;
网友评论