赞
踩
由下图可得MySQL的体系构架划分为:1.网络接入层 2.服务层 3.存储引擎层 4.文件系统层
1.网络接入层
提供了应用程序接入MySQL服务的接口。客户端与服务端建立连接,客户端发送SQL到服务端,Java中通过JDBC来实现连接数据库。
2.服务层
select uid,name from user where gender = 1;
select 查询先根据 where语句进行选取,而不是先将表全部查询出来以后再进行条件过滤。select查询先根据 uid 和 name进行属性投影,而不是将属性全部取出以后再进行过滤。将这两个查询条件联接起来生成最终查询结果3.存储引擎层
负责数据的存储和读取,与数据库文件打交道。 服务器中的查询执行引擎通过API与存储引擎进行通信,通过接口屏蔽了不同存储引擎之间的差异。MySQL采用插件式的存储引擎。MySQL为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。MySQL区别于其他数据库的最重要的一个特点就是插件式的表存储引擎,注意:存储引擎是基于表的。
4.系统文件层
该层主要是将数据库的数据存储在文件系统之上,并完成与存储引擎的交互。存储引擎是基于表的,以下分别使用MyISAM和InnoDB存储引擎建立两张表,看看其在文件系统中对应的文件存储格式。
存储引擎为MyISAM:
*.frm:存储表结构
*.MYD:MyISAM DATA,用于存储表的数据
*.MYI:MyISAM INDEX,用于存储表的索引
存储引擎为InnoDB:
*.frm:存储表结构 (mysql8.0之后去掉了frm表结构存储在ibd中)
*.ibd:InnoDB DATA,表数据和索引的文件。
区别:
MyISAM不支持事务,而InnoDB支持事务;
MyISAM支持表级锁,InnoDB支持行级锁和表级锁;
MyISAM不支持外键,而InnoDB支持外键;
MyISAM采用非聚簇索引,而InnoDB采用聚簇索引和非聚簇索引;
MyISAM支持管理非事务表,提高了全文检索的能力,如果业务上需要大量的select 请求,可以考虑使用MyISAM ,而InnoDB支持事务操作,适用于大量的update和insert操作。
【拓展】一个SQL语句在MySQL中的整体流程
MySQL区别于其他数据库的最重要的一个特点就是插件式的表存储引擎,也就是说存储引擎是基于表的。存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念 。
使用select version();
查看MySQL数据库版本
使用show engines
可以查看MySQL数据库有哪些引擎
这里介绍MySQL中常用的InnoDB和MyISAM,MySQL默认的数据库引擎是InnoDB
1.InnoDB引擎
InnoDB 是一个事务安全的存储引擎,它具备提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定保证数据一致性提升了它的多用户并发数以及性能。InnoDB 将用户数据存储在聚集索引中以减少基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。默认使用B+TREE数据结构存储索引。
特点
业务场景
InnoDB引擎调优
2.MyISAM引擎
MyISAM既不支持事务、也不支持外键、其优势是访问速度快,但是表级别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的数据场景。默认使用B+TREE数据结构存储索引。
特点
业务场景
MyISAM引擎调优
推荐参考: mysql数据库有哪些索引?
当 select 后面跟的查询条件在二级索引树上找不到时,就会进行回表
例:select id,name,age from user where name = '王强'; name是普通索引
这个sql就会进行回表:根据二级索引叶子结点主键ID到聚簇索引上面查找到对应行数据,这个过程就叫回表。简单说就是二级索引树上找不到完整数据,需要通过回表到聚簇索引才能找到。
因为索引是有序的,但是叶子节点ID不是有序的,所以回表操作是通过主键ID查询行数据是随机IO,会有一定性能影响,因此能不回表尽量不回表,也就是我们后面要讲的索引覆盖。
当我们select 后面要查询的数据都能在索引树上面取到,不需要回表时,就是索引覆盖
例:select id,name,age from user where name = '王强'; name,age是组合索引
像上面这个查询,所有数据都可以从 name,age组合索引树上面取到,就不需要回表,这就是索引覆盖。
索引下推是为了提升索引查询性能,把server层的过滤推送到存储引擎层,从而减少回表次数,减少IO。
索引跳跃(Index Skip Scan)是一种数据库查询优化技术,它允许数据库系统在某些情况下跳过索引的某些部分进行查询,以提高查询性能。这种技术通常在某些特定的情况下能够带来性能的提升。
注意:
存在意义:不用加锁,解决多并发场景下的快照读问题
在 MySQL 数据库中,锁是用来管理并发访问的重要机制,它可以确保数据操作的一致性,防止不同事务之间的冲突和竞争。 MySQL 中常见的锁类型包括行锁、表锁、意向锁、排他锁、共享锁、间隙锁以及临建锁。
推荐参考:MySQL 锁机制全面解析
推荐参考:mysql中如何实现乐观锁
推荐参考:mysql中常见问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。