https://storage.iamsjy.com/E-books/%E6%95%B0%E6%8D%AE%E5%BA%93/
一、mysql数据库存储引擎
1.1 innoDB存储引擎
是目前最常用的,支持事务,没有全文索引(1.2版本开始支持),在互联网大厂主要使用,具备高可用性,高性能已经高扩展性
1.2 MyISAM存储引擎
不支持事务和表锁设计,但支持全文索引。主要用于非etl场景,如报表查询等,缓冲池只缓存索引文件,不缓冲数据文件。5.0版本开始,支持256TB的表单数据。
由MYD和MYI组成。MYD存放数据文件,MYI存放索引文件。
1.3 NDB存储引擎
集群式存储引擎。 起结构是share nothing的集群架构,因此能提供更高的可用性。
特点是:数据全部存在内存中(5.1版本开始可以将非索引数据放在磁盘中),因此主键查询极快,并且通过添加NDB数据存储节点(Data Node)可以线性提高数据库性能,是高可用,高性能的集群系统。
有一点不同:NDB存储引擎的连接操作(JOIN)是在mysql 数据库层完成的,而不是存储引擎完成的。这意味着,复杂的连接操作需要巨大的网络开销,因此查询速度很慢。
1.4 Memory存储引擎
Memory存储引擎(之前称为HEAP存储引擎)将表中数据存在内存中,如果数据库重启或者发生崩溃,表中数据全部消失。适合存储临时表,以及数据仓库中的维度表。
默认使用哈希索引,而不是B+树索引,但可以手动配置B+树。
只支持表锁,并发性较差,不支持TEXT和BLOB列类型。
mysql数据库使用memory存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于Memory存储引擎表的容量设置时,又或者中间结果含义TEXT和BLOB列类型字段,则mysql数据库会把中间结果集转换到MyISAM存储引擎表而存放到磁盘中。之前提到的MyISAM不缓存数据文件,因此这时产生的临时表的性能对于查询会有损耗。
1.5 Archive存储引擎
只支持Insert和select操作,5.1版本开始支持索引。archive存储引擎使用zlib算法将数据行进行压缩后存储,压缩比一般可以达到1:10。正如其名,主要用于存储归档数据,如日志信息。
有行锁,支持高并发插入。但是本身并不是事务安全的存储引擎。设计目标主要是提供高速插入和压缩的功能。
1.6 Federated存储引擎
并不存放数据,只是指向一台远程mysql数据库服务器上的表。类似于oracle的透明网关,当前Federated存储引擎只支持mysql数据库表,不支持异构数据库表。
1.7 Maria存储引擎
maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的MyISAM存储引擎。可以看成是MyISAM存储引擎的后续版本。
特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务安全的的选项,以及BlOB字符类型的处理性能。
二、mysql主从复制
mysql主从复制原理就是主库创建一个专门用于给从库拉取binlog的账号,并且给这个账号授权,让他可以拉取哪个DB的那个表的binlog,具体的授权SQL是:
grant repliacation slave on xx.xx to username@ip identify by 'password'
这样从库就能登陆主库拉取binlog,那拉取binlog就得知道从哪个binlog的哪个位点拉取,现有的有两个方案:fileName + position 还有就是通过gtid自动找点。
什么是GTID?原理?
https://www.cnblogs.com/ZhuChangwu/p/13040214.html
同步、半同步、异步复制说的是 从库在主库上拉取binlog日志的模式。
同步:
主库写redolog 事物处于prepare状态、主库写binlog,然后从库拉取binlog去回放,从库回放成功后返回给主库ack确认,所有的从库都完成回放后主库提交事物。这样是可以保证主从数据一致的但是缺点就是速度太慢了。
半同步:
主库写redolog 事物处于prepare状态、主库写binlog,然后从库拉取binlog后返回给主库ack,在众多从库中只要收到一个ack主库就提交事物
异步复制:
主库根本不管从库有没有拉取回放binlog,直接写redo、binlog、然后提交事物
首先不允许出现主从数据不一致的情况:如果主从不一致对业务来说是有损的,一旦发生主从数据不一致的情况,从库就会出现断开连接的可能。
三、索引,聚簇索引及B+树
3.1 B-树就是B树;B树与B+树区别是:
B树每个节点存储key和data,每个节点key的数量比分支数量少1个;
B+树叶子节点才存储dataj,也存key,其他节点只存key。每个节点key的数量比分支数量相等;
3.2 主键索引,唯一索引,普通索引的区别
唯一索引
3.3 索引设计的原则:
-
适合索引的列是出现在where子句中的列,或者连接子句中指定的列。
-
基数较小的类,索引效果较差,没有必要在此列建立索引。
-
使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间。
-
不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
四、事务
4.1数据库隔离级别:
读未提交:在事务A中读取到了事务B中未提交的数据, 也叫做脏读。
读已提交(oracle默认):读已提交, 说白了, 事务A先开启, 然后事务B再开启, 然后事务B commit一个事务操作, 修改数据 , 那么这个修改是能被事务A读取到的, 这就叫做读已提交, 也是所谓的不可重复读,(因为重复读之后, 数据可能会发生变化)。
可重复读(mysql默认):事务A开启后, 无论读取多少次, 得到的结果都和第一次得到的结果是一样的, 但是如果事务B在事务A第一次读取的范围内插入了一条数据的话, 会发生幻读, 两次读取结果又不一致了, Mysql的InnoDB引擎通过多版本并发控制MVCC解决了这个问题。
序列化:可串行化, 最高的事务隔离级别, 到是也是效率最低的事务隔离级别
4.2事务的四种特性:
-
Atomic 原子性: 事务不能被分割, 要么都做, 要么都不做。
-
Consistency 一致性: 可以用转账的例子解释一致性。
-
Isolation 隔离性 : 不同的事务, 彼此隔离, 互不干扰。
-
Durability 持久性: 也叫做用就行, 事务一旦被提交, 对数据库做出的修改将被持久化 。
五、数据库范式
-
第一范式(1NF):
-
定义:所有字段的值都是不可再分的原子值。
-
要求:每个列中的数据都是单一值,表中的每一行都是唯一的。
-
-
第二范式(2NF):
-
定义:在满足第一范式的基础上,所有非主键列完全依赖于主键。
-
要求:表中不存在部分依赖,即每一个非主键列必须依赖于整个主键,而不是主键的一部分。
-
-
第三范式(3NF):
-
定义:在满足第二范式的基础上,所有非主键列直接依赖于主键,不存在传递依赖。
-
要求:每个非主键列都直接依赖于主键,而不是通过其他非主键列间接依赖于主键。
-
-
BC范式(Boyce-Codd Normal Form,BCNF):
-
定义:在满足第三范式的基础上,如果表中有候选键,所有列都必须依赖于候选键。
-
要求:每个候选键的所有非主键属性都必须依赖于候选键。
-
-
第四范式(4NF):
-
定义:在满足BC范式的基础上,不存在多值依赖。
-
要求:表中的每个多值依赖都必须被分解。
-
-
第五范式(5NF):
-
定义:在满足第四范式的基础上,不存在任何多余的连接依赖。
-
要求:表中的任何连接依赖都必须被分解
-
六 .MySQL Explain各字段含义
|
字段名 | 含义 |
|---|---|
| id | 选择标识符 |
| select_type | 表示查询的类型 |
| table | 输出结果集的表 |
| partitions | 匹配的分区 |
| type | 表示表的连接类型 |
| possible_keys | 表示查询时,可能使用的索引 |
| key | 表示实际使用的索引 |
| key_len | 索引字段的长度 |
| ref | 列与索引的比较 |
| rows | 扫描出的行数(估算的行数) |
| filtered | 按表条件过滤的行百分比 |
| Extra | 执行情况的描述和说明 |
MySQL:连Explain的Type类型都没搞清楚,怎敢说精通SQL优化?
七、sql 执行模式
数据库面试简答、30道高频面试题
浙公网安备 33010602011771号