MySQL简介
什么是MySql?
首先,我们要知道什么是
Mysql
。
其实我们在开发的时候,我们都需要对业务数据进行存储,这个时候,你们就会用到Mysql
、
oracal
等数据库。
MySQL其实是一种关系型数据库,什么是关系型数据库?关系表数据库,由表结构来存储数据与 数据之间的关系,同时用sql(Structured query language) 翻译过来叫做 结构化查询语句 来进行数据操作。
为什么使用MySQL?
1.免费且开源
2.生态完整
3.支持事务
4.使用工况全分析
架构
客户端:用来连接服务端执行对应SQL
服务端:解析命令执行增删查改的对应逻辑
存储引擎:真正去用来存储数据
ACID:原子性、可靠性、持久性、一致性
Sql执行大流程
解析器:解析SQL预计,会把一条SQL语句解析语法树,判断是否符合语法
词法解析:将SQL打碎,转化成一个一个关键词,交给词法解析器去构建语法树,判断语法是否正确。
语法解析:语法解析已经知道每个sql语句的单词了,那么在语法解析的时候,会去检查语法是否正确,比如,where是不是写出where1,from写成from1. 表名、列名是否存在、用户是否有操作权限等等。
如果写错了直接抛出错误,否则解析成如下的语法树。
预处理:我们就是在拼接sql语句的时候,将用户的输入跟语句拼接成一个sql语句给到mysql执行。 但是这样会引发一个问题:SQL注入
SQL注入:因为参数是客户端传过来的,所以可以传任何值,那么就有可能传入任何值就有了sql注入问题
例:
select * from table where id={id}
传入参数
1;select * from table limit 10
select * from table where id=1; select * FROM product LIMIT 10
预处理操作解决SQL注入
prepare pre_table from 'select * from teacher where id=? and age=?';
set @id=10;
set @age=34;
execute pre_table using @id,@age;
drop prepare pre_table ;
sql
注入是因为客户端拼接用户传入的参数,然后拼接好语句给到
mysql
,
这样会导致会安全问题。
优化器:
根据上面的流程,我们知道要去执行什么语句;但是具体怎么执行会有很
多的方式,比如走哪个索引,你的语句是不是可以优化
执行器:根据执行计划,去调用不同存储引擎的API接口获取数据
存储引擎
其中最常用的就是InnoDB和MyISAM
InnoDB
InnoDB
是一个事务安全
(
兼容
ACID)的MySQL
存储引擎,具有提交、回滚和崩溃恢复功能,以保护用户数据。 InnoDB行级别的锁
(
没有升级到更粗粒度的锁
)
和
oracle
风格一致的非锁读取提高了多用户并发性和性能。InnoDB
将用户数据存储在聚集索引中,以减少常见的基于主键的查询的I/O
。为了维护数据的完整性,
InnoDB
还支持外键引用完整性约束。
MyISAM
这些表占用空间很小。表级锁限制了读
/
写工作负载的性能,因此它经常用于Web
和数据仓库配置中的只读或以读为主的工作负载中。
两者的对⽐:
1.
是否⽀持⾏级锁
: MyISAM
只有表级锁
(table-level locking)
,⽽
InnoDB
⽀持⾏级锁
(row
level locking)
和表级锁
,
默认为⾏级锁。
2.
是否⽀持事务和崩溃后的安全恢复:
MyISAM
强调的是性能,每次查询具有原⼦性
,
其执⾏
速度⽐
InnoDB
类型更快,但是不提供事务⽀持。但是
InnoDB
提供事务⽀持事务,外部键等
⾼级数据库功能。 具有事务
(commit)
、回滚
(rollback)
和崩溃修复能⼒
(crash recovery
capabilities)
的事务安全
(transaction-safe (ACID compliant))
型表。
3.
是否⽀持外键:
MyISAM
不⽀持,⽽
InnoDB
⽀持。
4.
是否⽀持
MVCC
:仅
InnoDB
⽀持。应对⾼并发事务
, MVCC
⽐单纯的加锁更⾼效
;MVCC
只
在
READ COMMITTED
和
REPEATABLE READ
两个隔离级别下⼯作
;MVCC
可以使⽤ 乐
观
(optimistic)
锁 和 悲观
(pessimistic)
锁来实现
;
各数据库中
MVCC实现并不统⼀。
InnoDB表空间的
数据存储结构
segement(段):
段是表空间的分区,一个表空间中,会有多个段组成,常见的短有数据
段、索引段
extent(区):
区来管理页,当页的大小在
16K
以下,一个区的大小是
1M
,如果
32K
是
2M,64K
则为
4M
。后面磁盘释放分配都是以区为单位 所以,一个extent
下最少可以存储
64
个
page
页
page(
页):page
页,默认大小16KB
行(
Rows):
最大行长度略小
于数据库页面大小的一半