mysql的学习

开始从Mysql实战45讲开始学习,会转载一些图片和内容,不做商用。

开头,有一句话和大家共勉:

看一个事千万不要直接陷入细节里,应该鸟瞰其全貌,帮助从高维理解问题。 一起加油!

1.首先介绍从一条mysql语句的执行过过程,来加深对数据库的理解。

select * from table where id=10;

给出mysql逻辑架构图
在这里插入图片描述
mysql分为2层,一层为server层,一层为存储引擎层。
先来介绍server层,包括,连接器,查询缓存,分析器,优化器,执行器等,涵盖mysql的大多数核心服务功能,以及所有的内置函数(时期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现,比如,存储过程,触发器,视图等。

而存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持InnoDB,MyISAM,Memory等多个引擎。现在常用的存储引擎是innodb,从mysql5.5版本成为默认的存储引擎。

可以在创建表的时候create table,使用engine=memory,来指定内存引擎创建表。不同的存储引擎的表数据存取方式不同,支持的功能也不同。

1.先介绍连接器
先连接到数据库时,连接器就起作用了,连接器负责跟客户端建立连接,获取权限,维持和管理连接。
一般的连接命令:

mysql -h$ip -P$port -u$user -p

注意,在这个过程中,密码通过后,连接器会去权限表里查出你拥有的权限,之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
(管理员修改权限后,必须重新登录才能生效。)

同时,连接完成后,没有后续的动作,连接处于空闲状态。
show processlist 命令可以看到连接状态。 (Command列显示为Sleep的这一行,显示系统里的一个空闲连接)。
客户端太长时间没有连接,连接器就会自动断开,时间由参数 wait_timeout控制。默认值8小时。

使用长连接会带来内存高涨,资源在连接释放后才释放,长连接积累,导致内存占用太大,系统强行杀掉。从系统看就是Mysql异常重启。
怎么解决呢?2种方法:
1.定时断开,由程序判断,一个占用内存太大,断开连接,之后查询重连。

2.使用mysql5.7或更新版本。每次执行一个比较大的操作,通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连,和重新权限验证。恢复刚刚创建完时的状态。

查询缓存:
mysql拿到查询请求,先去查询缓存,如果有,直接返回,key是查询语句,结果是value,存在就返回。不存在就继续后面的操作流程。
大多数情况不使用缓存,因为一个更新操作,就会去除表上的缓存。对于更新压力大的数据来说,查询缓存命中率低,不建议使用
mysql 提供按需使用,通过
将query_cache_type设置成DEMAND,对默认的sql语句都不使用缓存查询。
确定使用的缓存语句,可以使用SQL_CACHE显示指定

select SQL_CACHE * from T where id=10;

mysql8.0直接删除掉缓存查询

分析器:
如果没有走查询缓存,分析器对sql语句做“词法分析”,需要从输入的字符串中分析你要干什么,再做“语法分析"。语法不对,就会报错。

优化器:
经过分析器,mysql就知道你要干什么,开始执行之前,还要进行优化。
优化器是在表里面有多个索引时,决定使用哪个索引;或者在一个语句有多表关联时,决定表的连接顺序,选择效率高的方案。

执行器:
开始执行语句,开始执行前,判断你对表有没有执行权限,没有就返回没有权限的错误,有权限,就继续执行
同时会在慢查询日志中发现rows_examined的字段,表示语句扫描了多少行,值是获取数据行累加的。
有些场景下,执行器执行一次,引擎内部扫描多行,引擎扫描次数跟rows_examined并不是完全相同的。

怎么看慢查询日志:
先看是否开启没:

 show variables like 'slow_query_log';

再看路径:

show variables like '%quer%';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值