第一章 | 初识MySQL
MySQL查询大致分为三部分:
- 连接管理
- 解析与优化
- 存储引擎
连接管理
客户端进程可以采用TCP/IP、命名管道或共享内存、UNIX域套接字等几种方式与服务器进程建立连接。
每当有一个客户进程连接到服务器进程时,服务器进程都会创建一个线程专门处理与这个客户端进行交互,当该客户端退出时会与服务器断开连接,但是服务器并不会立即把与该客户端交互的线程销毁,而是缓存起来,在另一个新的客户端再进行连接时把这个缓存的线程分配给该客户端,这样就不用频繁的创建和销毁线程,从而节省了开销。
解析与优化
查询缓存
MySQL会将查询请求和结果缓存起来,如果下次有相同请求就会从缓存中查找结果。如果两次查询请求有任何字符上的不同(空格、注释、大小写等)都会导致缓存不命中,如果查询请求中包含某些系统函数、用户自定义变量和函数、系统表、如mysql、information_schema、performance_schema数据库中的表则这个请求就不会被缓存。
MySQL的缓存系统会监测涉及的每张表,只要该表的结构或者数据被修改,比如对该表使用了INSERT、UPDATE、DELETE、TRUNCATE、TABLE、ALERT TABLE、DROP TABLE或者DROP DATEBASE语句则于该表有关的所有查询缓存都将变为无效并从查询缓存中删除。
查询缓存系统虽然有时候可以提升性能,但也不得不因维护这块缓存而造成一些开销,从MySQL5.7.20开始不推荐使用查询缓存,在MySQL8.0中直接将其删除。
语法解析
从指定文本中提取出需要的信息,本质上算是一个编译过程涉及词法解析、语法分析、语义分析等阶段。
查询优化
MySQL优化程序会对我们的语句做一些优化,如外连接抓转换为内连接、表达式简化,子查询转为连接等。
存储引擎
存储引擎以前叫作表处理器现在改为存储引擎,功能主要是接收上层传下来的指令对表中数据进行读取或写入操作。
部分存储引擎
| 存储引擎 | 描述 |
|---|---|
| ARCHIVE | 用于数据存档(记录插入后不能再修改) |
| BLACKHOLE | 丢弃写操作,读操作会返回空内容 |
| CSV | 在存储数据时,以逗号分隔各个数据项 |
| FEDERATED | 用来访问远程表 |
| InnoDB | 支持事务、行级锁、外键 |
| MEMORY | 数据值存储在内存,不存储在磁盘;多用于临时表 |
| MERGE | 用于管理多个MyISAM表构成的表集合 |
| MyISAM | 主要的非事务处理存储引擎 |
| NDB | MySQL集群专用存储引擎 |
常用的存储引擎是InnoDB和MyISAM,InnoDB从MySQL5.5.5版本开始作为MySQL默认存储引擎,之前版本的默认存储引擎为MyISAM。
查看数据库存储引擎
show engines;| Engine | Support | Comment | Transactions | XA | Savepoints |
|---|---|---|---|---|---|
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
