这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
前言
当我们通过数据库连接工具(如常见的
Navicat
,idea
自带的连接工具等),编写一条SQL语句执行后,它经历了哪些步骤,最后将结果返回给我们,为什么选择数据库的时候要选择MySQL?
MySQL体系结构
我们这里大致了解一下MySQL几个主要结构。
客户端
客户端指的就是一些连接工具,发送请求到数据库。
服务层
接收到客户端请求,通过一系列的处理最后响应给客户端,我们语句的执行主要就是在这里完成的。 连接管理器 控制数据库的连接 查询解析器 当我们拿到一个条
sql
语句的时候在这里会对它进行提取,解释其合法性。 查询优化器 解释器通过后,在这里我们会对执行sql
的进行优化,例如会将where
条件后面筛选力度大的放在最左边,虽然解释器会帮我们做一些优化,但是在书写时我们应该自己去规范自己,养成良好习惯。 查询缓存 细心的你会发现,但我们执行同一条sql语句两次,第二次查询的耗时为0.001s
,这是因为查询相同的数据,数据库会直接返回缓存里的数据。
存储引擎层
学习MySQL不得不了解的就是它的存储引擎了,最常见的就是
MyISAM
和InnoDb
了。 MySQL存储引擎 注意:存储引擎只针对表,所以一个数据库里可以允许有多个不同的引擎
InnoDB存储引擎
5.5.8
后指定为默认存储引擎 支持事务和高并发- 采用表空间保存文件
- 支持事务处理 存储特性
- 表空间有两种形式
- 使用系统表空间:
ibdataN
(所有数据放在一个文件中)
5.6
独立表空间:tablename.ibd
(推荐)- 设置
innodb_file_per_table
决定表空间模式
如何设置?
SHOW VARIABLES LIKE 'innodb_file_per_table'
ON表示当前使用的是独立表空间结构 可以通过以下语句切换成系统表空间结构
SET GLOBAL innodb_file_per_table = ON
为什么推荐独立表空间?
- 系统表空间
all in one
不利于管理- 系统表空间会产生
io
瓶颈- 系统表空间很难回收储存空间
- 独立表空间使用
optimize table
命令回收存储表空间