数据库:Mysql架构、索引、锁机制、事务、存储引擎

文章目录

      • 一、Mysql架构
      • 二、索引
      • 三、锁机制
      • 四、事务
      • 五、存储引擎
        • 5.1MyISAM
        • 5.2InnoDB
        • 5.3MEMORY
        • 5.4ARCHIVE

一、Mysql架构

Mysql架构:C/S架构,基于服务器端/客户端处理。
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第1张图片
执行流程:
1.先开启服务器端:service mysqld start
2.再由客户端连接服务器端:mysql -u root -p
3.当mysql -u root -p到达服务器端,先由连接池模块进行处理。连接池模块唤醒在池中沉睡的连接,接收此次请求。
4.当连接池拿到这条请求处理后,登录到服务器页面。连接时会从服务器管理模块mysql库中取到用户的id与密码进行匹配,匹配成功则登录;否则失败。
5.连接池中的连接进行阻塞等待客户端再次发送请求。例如:客户端再次发送select * from stu;连接池的连接接收到sql语句。
6.针对该条sql语句,进入到SQL API模块(结构化查询语句接口模块),核心处理DDL语句与DML语句,只将它们接收并不查询。
7.将该条SQL语句交给SQL解析器模块,对该条语句进行解析处理(词法分析、语法分析)。解析没问题进入下一模块,有问题则报错出错信息通过本次链接返回给客户端。
8.解析没有问题进入SQL优化器模块,针对SQL语句进行优化。最终产生了执行计划:指定出本条SQL语句执行流程。一条SQL语句在优化时产生很多执行计划,最终选择一个最合适的执行。
9.这条执行计划先从缓冲区查询,若缓冲区中查到通过本次链接交付给客户端;若没有找到则从磁盘中查询。
10.磁盘为硬件,对应有驱动程序来操作,有特殊的操作方式。数据库不会直接操作硬盘上的数据,在数据操作与磁盘中间有一个中间层(存储引擎:针对于底层数据文件的操作方式),中间层上规定了对于底层硬件的操作方式。针对于Mysql又名:插件式存储引擎的数据库,选择的存储引擎不同,针对于底层处理文件的方式也不同。
11.在硬件中拿到后,每次进行数据处理,要做一个记录,即日志系统log。日志记录完成后,给缓冲区存放一份,另一份沿着SQL API交给连接池,连接池再返回给客户端。

我们可以通过命令来查看存储引擎:show engines;每次根据数据处理只选择一种存储引擎来处理,这里默认为MyISAM存储引擎。
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第2张图片
 

二、索引

什么是索引呢,为什么需要索引呢,我们来瞧一瞧。
我们现在有一张t1表,里面含有10000条数据,想要查询这样一条数据,最坏与最好情况会查询多少次?
在这里插入图片描述
       顺序遍历:最坏情况需要10000次;最好情况需要根据结构设计来分析:若id字段为主键(primary)字段,最好查询一次即可;若id字段非逐渐,还需要查询10000次,这种查询即为顺序遍历,时间复杂度为O(n)。
       若此时数据库为查询密集型,顺序遍历效率十分低。我们改进一下,使用二分查找,时间复杂度为O(log2n),如果多路查询,时间复杂度为O(logxn),但它们前提必须排列有序,排序若放在查询前:O(n)+O(logxn),还不如顺序遍历;因此需要在插入数据时来排序,并不影响查询的时间复杂度,时间复杂度为logxn,数据需要以B+树(多路树)的形式来存储,B+树非叶子结点:放的关键字用于搜索数据,即索引值。 B+树非叶子节点:以链表形式连接。

索引:即数据结构,索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 创建一个索引就是创建一个数据结构,会让数据按照这种数据结构排列有序,提高查询效率。
       这里所说的索引是基于字段来说的,我们这里基于id主键字段建立了一个主键索引;基于id-card建立了一个唯一索引;而全文索引是基于varchar()字段或text字段(大文本字段)建立的索引。
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第3张图片
 

三、锁机制

为什么需要锁机制?
我们的数据库是一个多客户端的程序,允许多个客户端同时连接同一个数据库,处理时会出现并发情况,我们就需要加锁来控制了。

锁机制:并发处理时保证数据完整性。
表锁:将整张表的数据都锁定。 例如:A在读取该数据,读取过程中,B想要修改该数据,为了保证数据完整性对其进行加一个读锁(lock table A read),将整张表的数据都锁定了,B再修改时则堵塞;当我们释放读锁(unlock tables),B立马执行成功。
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第4张图片
行锁:将一行数据锁定。 例如:A读取第一行数据,此时B修改第二行数据,用表锁的话将整张表都锁定了效率就十分低;此时使用行锁效率会提高很多,A加了一个读锁,B修改时并没有影响直接写入,可以并发执行了。
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第5张图片
 

四、事务

事务:事务是一组SQL语句的集合,必须满足ACID特性才能成为事务。
A原子性:这一组SQL语句要么全部执行成功,要么全部执行失败。
C一致性:事务执行前后保证完整性约束。
I隔离性:消除事务间的相互影响。
D持久性:保证事务执行的结果再磁盘上永久的存储。
 

五、存储引擎

存储引擎:一种针读写操作,选择的存储引擎不同,针对于底层处理文件的方式也不同。

这里只列举了几个核心存储引擎,Windows下一般默认为InnoDB存储引擎,Linux下一般默认为MyISAM存储引擎(5.5以后Linux也默认为InnoDB存储引擎)。
对比一下:
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第6张图片

5.1MyISAM

MyISAM:数据在磁盘上存储,支持全文索引,不支持外键,支持B+树索引(数据与索引分离的),支持表锁,不支持事务锁。 对于一些在线分析处理操作速度快。文件组成myd存放数据的,myi存放索引的。

MyISAM中的索引:数据与索引分离,非聚集索引(数据可以随机或离散的分布)。因此MyISAM建立的索引一般有三个文件:.frm(存储基本配置信息与文件创建信息),.myd(存储数据),.myi(存储索引)。
创建索引:create index 索引名 on 表名.字段名;
创建好索引,索引结构即是B+树,只需要在B+树的叶子上存储数据的地址。通过索引项拿到索引值,拿索引值再去叶子节点上拿到数据的地址获取完整的数据。
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第7张图片

5.2InnoDB

InnoDB:数据在磁盘上存储,不支持全文索引,支持外键,支持B+树索引(索引当成数据一部分存储),支持行锁,支持事务锁。 主要是面向在线事务处理方面的应用,Innodb采用聚集索引的方式。没有主键,没有唯一键,为每一行生产一个6字节的行id,作为主键。

InnoDB的索引:数据与索引结合,把索引当成数据的一部分存储。叶子结点上直接存储数据。索引的范围决定了数据的范围,索引范围不太大因此数据比较聚集,因此也叫聚集索引。

若创建InnDB的表创建时并没有给出索引,可以存储数据吗?系统会自动创建索引。
1.有主键,系统根据主键创建主键索引,存储数据的索引主索引(数据不能重复)。
2.没有主键,有唯一键系统根据唯一键创建唯一索引,唯一索引变为主索引。
3.没有主键也没有唯一键,系统添加一个隐藏的字段(6个字节长度),隐藏的字段变为主索引。这个隐藏的字段里面的数据由系统添加,即autoincreament(自增长)类型。
数据库:Mysql架构、索引、锁机制、事务、存储引擎_第8张图片

5.3MEMORY

MOEMORY:数据在内存中存储,如果数据库重启或者宕机,表数据就会丢失。非常适合存储一些临时表,默认的是哈希索引。 varchar()默认是按照char()存储的,浪费内存。不支持text和BLOB类型。如果数据中有text和BLOB类型,数据库会把这些数字转换到磁盘上。

真实的表中抽离出来四个字段,若刚好有一个addr字段为text字段,若将该数据放入MEMORY中存储,MEMORY却不支持text字段。如何将其存储到临时表中呢?
       此时MEMORY会将addr交给MyISAM存储引擎处理,其它字段还是MEMORY存储引擎处理。数据一部分在内存,一部分在磁盘上,查询效率低。因此,MEMORY使用时尽量避免出现text与BLOB字段数据。

数据库:Mysql架构、索引、锁机制、事务、存储引擎_第9张图片

5.4ARCHIVE

ARCHIVE(归档/压缩存储引擎):只支持INSERT和SELECT操作,使用压缩算法将数据进行压缩后存储,压缩比例一般是1:10,主要提供插入和压缩功能。 适用于数据量大,查询较少的场景,例如:日志数据;只支持插入和查询操作,不支持修改操作。

你可能感兴趣的:(数据库)