一个普通的程序运行过程:
5、在处理完数据,按ctl+s保存后,关闭窗口,内存的数据会进行释放,好的程序会有一些数据的回收策略,不会永久驻在内存
MySQL数据库实例运行过程:
mysql服务器构成:
1、程序加载到内存,申请空间运行起来
2、把数据加载到内存,程序处理文件,处理完数据后把数据存到硬盘
3、内存释放,程序回收垃圾
画图来说明:
1、MySQLd守护进程的程序块先加载到内存,然后申请空间运行起来,
2、把ibd数据文件加载到内存:存放数据库和表
3、mysqld处理ibd数据
4、idb数据文件写入到磁盘,持久化
5、程序不会退出,因为程序会频繁的使用数据库,所以这里不会像office用了就关闭,
避免重复去申请内存空间,这里直接使用守护进程,一直在内存中,用就调用,不用就休息等待程序来调用
适合程序频繁调用的模式
6、实例:
mysqld 主进程不会直接参与数据的处理,会起master thread
MySQL进程线程结构
mysqld(boss)------>master thread(Manager) ---->"worker" thread
(read thread write thread)
“办公区“(提前预定好的长期的)------>预分配内存结构
MySQL启动过程:
1、启动后台守护进程,并生成工作线程
2、预分配内存结构供mysql处理数据使用
mysqld+一堆thread +预分配的内存结构=实例
mysqld服务程序构成:
mysqld的体系结构
一条SQL语句的执行过程? select user,host ,password from mysql.user;
连接层:【与用户打交道】
1、客户端发起数据库连接。
mysql
2、连接请求到达连接层,验证用户、密码合法性。
select user,host ,password from mysql.user;
3、连接层接受用户SQL,分配一个专门用作交互的线程(connect thread);
show [full] processlist;
**
连接层无法处理数据,必须交给sql层
SQL层的功能
4、连接层线程会将SQL传送SQL层继续处理
5、SQL层接受到SQL语句,语法解释器验证语法
6、语义验证器,检测语句类型(DDL、DML、DCL、DQL),根据不同的类型交于不同对应解析器继续处理
7、解析器接受到SQL,进行解析,解析出执行计划
8、优化器会基于成本的算法,找到成本最低的执行计划【索引优化,sql优化】
9、执行器基于最优语句的执行计划进行执行,得到获取数据的方法,
会将方法TP给下一层继续处理【扇区、磁道】
10、每条sql的解析都这么复杂,所以提供查询缓存,将上一条语句的结果【语句的sqlid】。
11、记录日志(默认没有开启)
存储引擎层:
12、按照SQL提供的获取数据的方法,去对应磁盘位置获取数据即可。
13、将二进制或十六进制的数据结构化成表的形式,由连接线程返回给用户