数据库
数据库
Mysql架构
大体分为Server层和存储引擎
Server层包括 连接器、查询缓存、分析器、执行器。
连接器:负责管理连接和权限验证
查询缓存:如果查询的语句命中了查询缓存则直接返回结果
分析器:进行词法分析和语法分析
执行器:操作引擎,返回结果
存储引擎层
不同的数据文件在。负责数据的存储和提取,提供读写接口。他的架构模式是插件式,支持InnoDB、MyISAM、Memory 等多个存储引擎。
索引
● 索引它是一种数据结构,它的出现就是为了提高数据库查询数据的效率,它就像书的目录一样。
● 索引本身是很大的,不可能全部存储在内存中,它通常是保存在磁盘的文件中。(其中,InnoDB 的索引是和数据一起存储在数据文件中的。)
InoDB 索引为什么是B+树?
先看下其他的可以做到键值对的数据结构。
hash表:可能产生hash冲突,数据散列不均匀。
当需要进行范围查找的时候需要挨个遍历,效率低
memory的存储引擎支持的时hash索引,同时注意innodb存储引擎支持自适应hash。
AVL,红黑树:
插入大量数据时,树的高度会不断增加。而树高的增加带来的问题就是,磁盘I/O操作的次数的增加,这样花费的时间就会更多。
B树:
B树所有结点都存储键值和数据
B+树只有叶子节点才有,非叶子结点只存储键值,所以理论上B+树会比B树更加矮胖。
B+树的叶子节点之间有双向指针连接,B+树最底层的叶子节点构成了双向有序链表。
在连续查找的情况下,B树每次都需要从根节点遍历到叶子结点,但是B+树可以直接在叶子结点之间连接的指针来进行查找。
哈希索引
哈希索引是以哈希表为数据结构实现的,以键值对的方式存储数据,key 存储索引列,value 存储行记录。
哈希索引能以 O(1) 的时间复杂度的进行精确查找,但进行范围查找时效率却非常低。
InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用得非常频繁时,就会在 B+ 树索引之上再创建一个哈希索引,这样就可以让 B+ 树索引拥用快速哈希查找的优点。
聚簇索引和非聚簇索引
简单来说,数据和索引在一起的是聚簇索引,没有在一起的是非聚簇索引
InnoDB 表都有一个聚簇索引,是一定有,有主键,索引是主键。
Innodb使用的是聚簇索引+非聚簇索引,MyISam只有非聚簇索引。
回表、索引覆盖、最左匹配、索引下推
回表:
id,name,age,gender
select * from table where name = "zhangsan";
先根据nameB+树匹配到对应的叶子节点,查询到对应的行记录的id值,再去id中的B+树找整行记录,称之为回表(坏东西)。
索引覆盖:
id,name,age,gender
select id,name from table where name = "zhangsan";
先根据nameB+树匹配到对应的叶子节点,查询到对应的行记录的id值,不去查询整行,这就是覆盖索引(好东西),在一些时候可以将所有的列变成组合索引,会加快效率。
最左匹配:
创建索引的时候可以选择多个列组成索引,也就是组合索引或者联合索引,遵循最左匹配
id,name,age,gedner
id主键,(name,age)组合索引
select * from table where name = 'xx' and age = 12
select * from table where name = 'xx'
select * from table where age = 12
select * from table where age = 12 and name = 'xx'
只有第三个不会使用最左匹配。
索引下推:
select * from table where name = 'xx' and age =12
没有索引下推之前:
先根据name从存储引擎中拉取数据serve层,然后在server层中对age进行数据过滤。
有索引下推:
根据name和age两个条件来做数据筛选,将筛选之后的结果返回给serve层。
优化问题
加索引,看执行计划,优化sql语句,分库分表,表的结构设计。
//还需要润色以下
事务
ACID:原子性、一致性、隔离性、持久性
原子性是指事务的所有操作要么全部提交成功,要么全部失败回滚。
原子性用undo log回滚日志来保证,回滚日志会记录当前事务的反向操作,将数据恢复到事务开始执行前的状态。
一致性:数据库在事务执行前后保持一致,只有满足一致性,事务的结果才是正确的。
隔离性:是指并发执行的各个事务之间操作不能互相干涉。
没有隔离性,就会有脏读、不重复读、幻读的情况。所以事务与事务之间需要一定的隔离性,可以通过锁来实现。
事务有四个等级:读未提交、读提交、可重复读和串行化。
持久性:是指当一个事务被提交之后,它对数据库的修改应当是永久的,就算数据库异常重启,只要事务提交了,数据到最后都应当被持久化到磁盘中。
锁
分类:
粒度:行锁、表锁
读写:共享锁、排他锁
程序员角度:乐观锁、悲观锁
MVCC
多版本并发控制:是innoDB存储引擎实现隔离级别的一种具体方式。实现“读提交”和“可重复读”两种隔离级别。而“读未提交”隔离级别总是会读取到最新版本的数据,无需使用MVCC。
当前读:读取的数据的最新版本,总是读取到最新数据
快照读:读取的是历史版本的记录
Innodb和MyISAM的区别
Innodb支持事务而MyISAM不支持,如果仅进行查询的非事务操作,考虑MyISAM,MyISAM拥有高速检索和全文搜索的能力。
InnoDB 支持表级锁和行锁,而 MyISAM 只支持表级锁。
InnoDB 的主键索引是聚簇索引,即叶子节点存放着整行的数据;而 MyISAM 是非聚簇索引,叶子节点存放的是数据的磁盘地址;但它们都是使用 B+ 树实现的索引。