查询的过程
首先确认mysql 服务器是否启动 systemctl mysqld status
登录连接 mysql -h i p − u ip -u ip−uuser -p (-h 指定服务器ip -u 指定用户名 -p 指定密码)
mysql 数据包 经过抓包分析(mysql包其实就是基于tcp协议 3306端口) 传输采用mysql 协议,数据也是加密了的所以这里也是先有三次握手、然后执行sql 再是四次挥手
上面的是短连接,下面就来讲一下长连接
三次握手
执行sql
执行sql
执行sql
……
四次挥手当连接上了,可以查看有多少个客户端已经连接 show processlist;
可以查看 客户端最大连接数 show variables like ‘max_connections’;
连接的客户端状态有的是sleep、有的是query
可以查看 最长空闲连接时间 show variables like ‘wait_timeout’;
当然也可以手动断开空闲连接, kill connection +id;
接着查询缓存,注意mysql8.0以前的存储引擎采用的是innodb,缓存采用的是buffer pool
当要查询的结果,缓存中匹配上了,就直接返回结果注意,budder pool 中采用的是key–value 形式进行缓存
但是当要查询的的表有更新操作,那么这个表的查询缓存就会被清空。
所以,这样一个场景,混存中有上一次查询的记录,但是又来了一个对这张表的另一个更改操作,导致这张表中的缓存全都清空,这时候再来一次查询就要从磁盘中查找了。接着进行的是解析
解析,会根据关键词拆分,把语句拆成一个b+树
需要注意的是,sql 语句的语法检测,不是在这部份进行的,而是在下面的部份
执行sql
sql执行分为三步
预处理阶段(这个阶段会进行语法检测)、
优化阶段(比如有多个索引方式,优化器会将sql的方案确定下来,可以使用 explain + 执行的语句;
key 展示的就是用哪个索引。
执行阶段,执行sql语句。讲一下,索引
索引的结构都有哪几种:
哈希索引:把索引当成key 然后去查找,速度很快,但是一个键只能对应一个值无法像树那样散列的分布
B+树:多路平衡二叉树,每个节点可以包含多个关键字和指向子节点的指针,内部节点不存储数据,只存储索引信息和指向子节点的指针,叶子节点有序(关键字都是有序排列在列子节点中,叶子节点之间通过指针相连形成链表、由于是高度平衡,所以查询的时间复杂度趋于logn再讲讲索引的类型
普通索引,在建表的时候添加 index idex_name (name) -----解释:idex_name 为索引名、name 为字段名
或者在建完表以后,create index idex_name on student(name); -----解释: student 为表名 name 是创建该字段为索引
删除索引
srop index idex_name on student;
除了普通索引,还有主键索引,注意表中的主键默认就是采用了主键索引,换句话说,这个操作是多余的?
还有组合索引,组合索引要求组合的字段不为null,而且组合的结果必须唯一,注意组合索引还支持最左前缀原则,什么意思呢,就是当你创建了组合索引idex_name_student_id(name student_id),然后而是采用 name 去筛选,默认使用的就是组合索引idex_name_student_id,如果用student_id 去筛选,不会用组合索引。
create index idex_name_student_id on student(name, student_id);
同样执行的时候 最前面添加 explain 去查看这条语句执行的规则
当然还有 全文索引
讲了索引,再继续讲执行语句
在innodb 索引引擎中,(5.7—8)? (5.7之前是MyISAM ?)
因为innodb 是支持事务的,特点就是原子性,要么不错,要做就成功
执行sql,在buffer poll 缓存中找,如果没有便从磁盘中读取,这个io开销很大的,然后这个时候会会有undo日志工作,用于记录更新当前的sql,方便回滚操作。如果是执行更改 innodb 会在 buffer pool 执行 然后将 日志写入Redo log buffer 中,再将日志刷入磁盘redo磁盘文件
感觉后面的部份还是讲的有点含糊
待加强!!!!!
参考1
参考2
参考3
参考4–更新一条sql
三种存储引擎的区别
参考5
myisam (5.1以前的版本,上面说5.7 修正一下)
该存储引擎保存了单独的索引文件.myi 而且它的索引是直接定位到OFFSET的,注意innodb 没有单独的物理存储索引文件,且innodb索引寻址是先定位到块数据,再定位到行数据,所以前者的索引速度快于后者(innodb)但是它不支持事务、不支持外键,所以适合场景:读多写少,对完整性要求不高的场景。
innodb
支持事务、支持外键、支持崩溃修复和自增列,对业务的完整性要求高。对读写效率较差,占用数据空间较大
在写入的时候也讲过undo、buffer pool
比如张三给李四转钱,这个事务要求表中张三的金额减少,李四金额增加,如果失败,则两个人的存款余额不变,如果转账成功,张三减少的数量就是李四增加的数量。保证了事务的完整性。
因为存储引擎的设置粒度是表级别,也就是说可以在每张表中设置不同的存储引擎。
查看表的时候,就可以看到
show table biao1;
设置biao1 的存储引擎
create table t1 engine = INNODB;
或者选择 MyISAM、MEMORY