Mysql 是怎样运行的
初识
服务器处理客户端请求
大致需要经过三个部分,分别是连接管理
、解析与优化
、存储引擎
。
客户端可以采用TCP/IP
、命名管道或共享内存
、Unix域套接字
等方式与服务器建立通信
每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端 。
当连接建立后,与该客户端关联的服务器线程会一直等待客户端发送过来的请求
解析与优化
查询缓存
如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。另外,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如 mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存
MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了INSERT
、 UPDATE
、DELETE
、TRUNCATE TABLE
、ALTER TABLE
、DROP TABLE
或 DROP DATABASE
语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!
虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。
字符集的比较规则
将一个字符映射成一个二进制数据的过程叫编码, 将一个二进制数据映射到一个字符的过程叫解码
InnoDB 记录存储结构
InnoDB 是一个将表中的数据存储到磁盘上的存储引擎.
InnoDB 将数据分成若干个页, 以页作为磁盘和内存间交互的基本单位.
InnoDB 中页的大小一般为 16KB. 一般情况下, 一次最少从磁盘中读写 16KB 的数据.
InnoDB 行格式
COMPACT, REDUNDANT, DYNAMIC, COMPRESSED
指定行格式的语法
CREATE TABEL TABEL_NAME () ROW_FORMAT=COMPAC
COMPACT 行格式
在COMPACT
行格式中, 所有变长字段的真实数据占用的字节数都存放在记录的开头位置, 从而形成一个变长字段长度列表,各变长字段的真是数据占用的字节按照列的顺序_逆序_存放
InnoDB 主键生成策略
如果user没有定义主键, 则选取一个不允许存储 NULL
的UNIQUE
键作为主键. 如果表中不存在不为NULL
的UNIQUE
键, 则 InnoDB
会为表添加一个名为row_id
的隐藏列作为主键