1.数据库三大范式

*
第一范式:确保每列保持原子性,数据表中的所有字段值都是不可分解的原子值。

*
第二范式:确保表中的每列都和主键相关。

*
第三范式:确保每列都和主键列直接相关而不是间接相关。

2. MySql几种引擎,有什么区别

特性InnoDBMyISAMMEMORY
事物安全支持不支持不支持
对外建的支持支持不支持不支持
存储限制64TB有有
空间使用高低低
内存使用高低高
插入数据的速度低高高
2.1、 InnoDB、MyISAM 对比

*
InnoDB支持事务,MyISAM不支持。

*
InnoDB 支持外键,而 MyISAM 不支持。

*
InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键
。MyISAM是非聚集索引,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

*
InnoDB 不保存表的具体行数。MyISAM 用一个变量保存了整个表的行数。

*
Innodb 有 redolog 日志文件,MyISAM 没有。

*
Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI。

*
Innodb:frm是表定义文件,ibd是数据文件。

*
Myisam:frm是表定义文件,myd是数据文件,myi是索引文件。

*
InnoDB 支持表、行锁,而 MyISAM 支持表级锁。

*
InnoDB 必须有唯一索引(主键),如果没有指定的话 InnoDB 会自己生成一个隐藏列 Row_id 来充当默认主键,MyISAM 可以没有。

3. 为什么要使用自增主键?

1.普通索引的 B+ 树上存放的是主键索引的值,如果该值较大,会「导致普通索引的存储空间较大」

2.使用自增 id 做主键索引新插入数据只要放在该页的最尾端就可以,直接「按照顺序插入」,不用刻意维护

3.页分裂容易维护,当插入数据的当前页快满时,会发生页分裂的现象,如果主键索引不为自增
id,那么数据就可能从页的中间插入,页的数据会频繁的变动,「导致页分裂维护成本较高」

4.解释一下什么是索引?

        索引是对数据库表的一列或者多列的值进行排序一种结构,使用索引可以快速访问数据表中的特定信息。

4.1、索引的优缺点?

优点:

*
大大加快数据检索的速度。

*
将随机I/O变成顺序I/O(因为B+树的叶子节点是连接在一起的)

*
加速表与表之间的连接

缺点:

*
从空间角度考虑,建立索引需要占用物理空间

*
从时间角度 考虑,创建和维护索引都需要花费时间,例如对数据进行增删改的时候都需要维护索引。

4.2 索引的数据结构?

        索引的数据结构主要有 B+ 树和哈希表,对应的索引分别为 B+ 树索引和哈希索引。InnoDB 默认的索引类型为 B+ 树索引。

4.3 索引的类型有哪些?

        MySQL 主要的索引类型主要有 FULLTEXT(全文索引),HASH(哈希索引),BTREE(B+树索引),RTREE(空间索引)。

*
FULLTEXT
即全文索引,MyISAM存储引擎和InnoDB存储引擎在MySQL5.6.4以上版本支持全文索引,一般用于查找文本中的关键字,多在CHAR,VARCHAR,TAXT
等数据类型上创建全文索引。全文索引主要是用来解决WHERE name LIKE "%wekenw%"等针对文本的模糊查询效率低的问题。

*
HASH 即哈希索引,哈希索引多用于等值查询,时间复杂夫为o(1),效率非常高,但不支持排序、范围查询及模糊查询等。

*
BTREE 即 B+ 树索引,INnoDB存储引擎默认的索引,支持排序、分组、范围查询、模糊查询等,并且性能稳定。

*
RTREE 即空间数据索引,多用于地理数据的存储,相比于其他索引,空间数据索引的优势在于范围查找。

4.4 索引的种类有哪些?

*
主键索引:数据列不允许重复,不能为NULL,一个表只能有一个主键索引

*
组合索引:由多个列值组成的索引。

*
唯一索引:数据列不允许重复,可以为NULL,索引列的值必须唯一的,如果是组合索引,则列值的组合必须唯一。

*
全文索引:对文本的内容进行搜索。

*
普通索引:基本的索引类型,可以为NULL

4.5 什么是聚簇索引,什么是非聚簇索引?

 聚簇索引:将数据和索引放到一起存储,索引结构的叶子节点保留了数据行。

非聚簇索引:将数据进和索引分开存储,索引叶子节点存储的是指向数据行的地址。

4.6 索引的设计原则?

* 最适合创建索引的列是出现在 WHERE 或 ON 子句中的列,或连接子句中的列而不是出现在SELECT关键字后的列。
* 对于字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间。
* 索引列的基数越大、索引列的区分度越高,索引的效果越好。
* 尽量使用短索引,因为较小的索引涉及到的磁盘I/O较少,并且索引高速缓存中的块可以容纳更多的键值,会使得查询速度更快。
* 尽量利用最左前缀。
* 不要过度索引,每个索引都需要额外的物理空间,维护也需要花费时间,所以索引不是越多越好。
4.7 索引失效的场景有哪些?

* 不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描。
* 不能继续使用索引中范围条件(bettween、<、>、in等)右边的列 。
* 索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描。
* 索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描。
* 索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描,也是最左前缀原则。
* 索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描。
* 索引字段使用 or 时,会导致索引失效而转向全表扫描。
4.8 创建索引的语法
首先创建一个表:create table t1 (id int primary key,username varchar(20),password
varchar(20)); 创建单个索引的语法:CREATE INDEX 索引名 on 表名(字段名) 索引名一般是:表名_字段名
给id创建索引:CREATE INDEX t1_id on t1(id); 创建联合索引的语法:CREATE INDEX 索引名 on
表名(字段名1,字段名2) 给 username 和 password 创建联合索引:CREATE index t1_username_password ON
t1(username,password) 其中index还可以替换成 unique,primary key,分别代表唯一索引和主键索引 删除索引:DROP
INDEX t1_username_password ON t1
 5.数据库的事务

5.1 什么是事务?其特性是什么?

事务是指是程序中一系列操作必须全部成功完成,有一个失败则全部失败

特性:

*
1.「原子性(Atomicity)」:要么全部执行成功,要么全部不执行。

*
2.「一致性(Consistency)」:事务前后数据的完整性必须保持一致。

*
3.「隔离性(Isolation)」:隔离性是当多个事务同事触发时,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

*
4.「持久性(Durability)」:事务完成之后的改变是永久的。

5.2 事务的隔离级别? 

*
1.「读已提交」:即能够「读取到那些已经提交」的数据。

*
2.「读未提交」:即能够「读取到没有被提交」的数据。

*
3.「可重复读」:可重复读指的是在一个事务内,最开始读到的数据和事务结束前的「任意时刻读到的同一批数据都是一致的」。

*
4.「可串行化」:最高事务隔离级别,不管多少事务,都是「依次按序一个一个执行」。

5.3 隔离性实现原理

隔离性的实现原理比较特殊,是通过数据库锁的机制实现的。

隔离性分四个级别:

*
读未提交:一个事务可以读到另外一个事务未提交的数据。脏读

实现:事务在读数据的时候并未对数据进行加锁。

事务在发生更新数据的瞬间,必须先对其加 行级共享锁,直到事务结束才释放。

举例:事务A读取某行记录时(没有加锁),事务2也能对这行记录进行读取、更新。当事务B对该记录进行更新时,事务A读取该记录,能读到事务B对该记录的修改版本,即使该修改尚未被提交。

事务A更新某行记录时,事务B不能对这行记录做更新,直到事务A结束。

*
读已提交:一个事务可以读到另外一个事务提交的数据。不可重复读

实现:事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;

事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。

原理:事务A读取某行记录时,事务B也能对这行记录进行读取、更新;当事务B对该记录进行更新时,事务A再次读取该记录,读到的只能是事务B对其更新前的版本,或者事务B提交后的版本。事务A更新某行记录时,事务B不能对这行记录做更新,直到事务1结束。

流程描述:事务A读操作会加上共享锁,事务B写操作时会加上排他锁
,当事务B正在写操作时,事务A要读操作,发现有排他锁,事务A就会阻塞,等待排他锁释放(事务B写操作提交才会释放),才能进行读操作。

*
可重复读

实现:事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 行级共享锁,直到事务结束才释放;

事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。

举例:事务A读取某行记录时,事务B也能对这行记录进行读取、更新;当事务B对该记录进行更新时,事务A再次读取该记录,读到的仍然是第一次读取的那个版本。事务A更新某行记录时,事务B不能对这行记录做更新,直到事务1结束。

*
可串行化(Serializable) 写操作串联执行

实现:事务在读取数据时,必须先对其加 表级共享锁 ,直到事务结束才释放;

事务在更新数据时,必须先对其加 表级排他锁 ,直到事务结束才释放。

举例:事务A正在读取A表中的记录时,则事务B也能读取A表,但不能对A表做更新、新增、删除,直到事务A结束。事务A正在更新A表中的记录时,则事务B不能读取A表的任意记录,更不可能对A表做更新、新增、删除,直到事务A结束。

原理:在读操作时,加表级共享锁,事务结束时释放;写操作时候,加表级独占锁,事务结束时释放。

「MySQL的默认隔离级别是可重复读。」数据库的隔离级别分别可以解决数据库的脏读、不可重复读、幻读等问题。

* 1.「脏读」
*
脏读指的是「读到了其他事务未提交的数据」,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
* 2.「不可重复读」
* 对比可重复读,不可重复读指的是在同一事务内,「不同的时刻读到的同一批数据可能是不一样的」。
* 3.「幻读」
*
幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现「好像刚刚的更改对于某些数据未起作用」,但其实是事务B刚插入进来的这就叫幻读。
5.4 隔离级别是如何实现的?

事务的隔离机制主要是依靠锁机制和MVCC(多版本并发控制)实现的,提交读和可重复读可以通过MVCC实现,串行化可以通过锁机制实现。

6. 什么是MVCC,有什么作用?

MVCC:多版本并发控制,主要用来提高数据库的并发性能。

MVCC的作用就是在不加锁的情况下,解决数据库读写冲突问题,并且解决脏读、幻读、不可重复读等问题,但是不能解决丢失修改问题。

技术
©2019-2020 Toolsou All rights reserved,
TypeScript:函数类型接口8道大厂指针笔试题让你秒杀指针!!!MySQL 日期时间加减mysql 查询条件之外的数据_mysql 查询符合条件的数据查linux的操作系统版本,如何查看Linux操作系统版本?将String类型转换成Map数据类型使用uuid做MySQL主键,被老板,爆怼一顿C语言中的字符串函数和字符函数linux服务器中毒排查--基础篇C# ASCII码字符转换