1.数据库三大范式是什么

第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键

2.什么是索引?有哪些优缺点?

索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录
优点:
1.可以大大加快数据的检索速度,这也是常见索引的最主要的原因。
2.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
时间方面:创建索引和维护索引要耗费时间,当对表中的数据进行增加、删除和修改的时 候,索引也要动态的维护,会降低增/改/删的执行效率;
空间方面:索引需要占物理空间。

3.什么是事务,事务的四大特性

事务是指单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保操作要么全部完成,要么完全不起作用
一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响

4.

5.MySQL为什么要加索引

因为可以很大的提高数据的检索速度,这也是常见添加索引的最主要的原因。但随之而来创建索引和维护索引要耗费时间,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率。

6.数据库优化知道吗?讲一下思路

1.应尽量避免在 where 子句中对字段进行 null 值判断
2.避免在where子句中使用!=或<>操作符
3.避免在where子句中使用or来连接条件
4.避免在where中对字段进行表达式操作
5.索引不宜太多,一般5个以内
6.尽量使用数值替代字符串类型
7.尽可能的使用 varchar 代替 char
8.查询SQL尽量不要使用select *,而是具体字段
9.避免频繁创建和删除临时表,以减少系统表资源的消耗。
10.查询尽量避免返回大量数据
11.对查询进行优化,应尽量避免全表扫描,应考虑在 where 及 order by 的列上建立索引

7.什么情况下索引失效

  1. 如果条件中有or,即使其中有条件带索引也不会使用(要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引)
  2. 对于多列索引,不符合最左原则
  3. like查询是以%开头
  4. 如果列类型是字符串,要在条件中使用引号引起来,否则不会使用索引
  5. 如果mysql使用全表扫描比使用索引快,则不使用索引

    8.什么是sql注入

    利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作
    造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码
    防止策略
    1.严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限
    2检查输入的数据是否具有所期望的数据格式,严格限制变量的类型
    3.对进入数据库的特殊字符进行转义处理,或编码转换

    9.MySQL中的varchar和char有什么区别

    varchar的长度是可变的,char的长度不可变。
    存储时,char类型的数据要比varchar类型的数据速度更快,因为其长度固定,方便存储于查找
    从存储空间的角度讲,因为插入类型数据的长度固定,有时候需要用空格进行占位,所以存储数据时占用更大的空间。而varchar却不会。char是以空间换取时间效率,而varchar 是以空间效率为首位的。
    char的存储方式是,对英文字符占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据

    10.什么是索引?

    索引是一种特殊的文件(InnoDB数据表)他们包含这对数据表里所有记录的引用指针。
    索引是一种数据结构,数据库索引,是数据库管理系统中一个排序的数据机构,以协助快速查询,更新数据库表中数据,索引的实现通常使用B树及其变种B+树。
    更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

11.事务的隔离级别?MySQL的默认隔离级别?

读未提交(Read uncommitted) 安全性最差,可能发生并发数据问题,性能最好
读提交(read committed) Oracle默认的隔离级别
可重复读(repeatable read)MySQL默认的隔离级别,安全性较好,性能一般
串行化(Serializable) 表级锁,读写都加锁,效率低下,安全性高,不能并发

12.jdbc链接池是什么?

HikariCP

13.mysql的存储引擎有哪些?

简要回答

1.存储引擎是用来把数据存储在文件或内存的技术
2.mysql常用的存储引擎有四种,常用的有MyISAM,InnoDB,MEMORY,ARCHIVE;
3.innoDB支持事务,支持外键,支持表锁,支持全文索引,读取数据快

问题回答
1.Mysql中的数据用各种不同的技术储存在文件(或内存)中,这些技术中的每一个技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力.在MySQL中将这些不同的技术及配套的相关功能称为存储引擎.

2.存储引擎其实就是对于数据库文件的一种存取机制,如何实现存储数据,如何为储存的数据建立索引以及如何更新,查询数据等技术实现的方法

3.mysql存储引擎总共有九种,常用的数据引擎有MyISAM,InnDB,MEMORY,ARCHIVE;

(查看mysql支持引擎命令:SHOW ENGINES;对于MySQL 5.5及更高版本,默认的存储引擎是InnoDB。在5.5版本之前,MySQL的默认存储引擎是MyISAM。)

4.MyISAM和InnDB的区别:
MyISAM存放的方式:MyISAM这种引擎不支持事务,不支持行级锁,只支持并发插入的表锁,主要用于高负载的select.

索引的方式:MyISAM也是使用B+tree索引但是和InnoDB的在具体实现上有些不同

优缺点:MyISAM的优势在于占用空间小,处理速度快,缺点就是不支持事务的完整性和并发性

InnoDB存放的方式:innodb支持自增长列(auto_increment),自增长列的值不能为空,如果在使用的时候为空的话会进行自动存现有的值开始增值,如果有但是比现在的还大,则就保存这个值.

innodb存储引擎支持外键(foreign key),外键所在的表称为字表而所依赖的表称为父表.

innodb存储引擎最重要的是支持事务,以及事务相关联的功能.支持mvcc的行级锁

索引的方式:innodb存储引擎使用的是B+Tree

优缺点:InnoDB的优势在于提供了良好的事务处理,崩溃修复能力和并发控制,缺点是读写效率较差,占用的数据空间相对较大.

14.mysql和mongoDB的区别是什么?

15.说一下表的连接方式。

内连接、自连接、外连接(左、右、全)、交叉连接
内连接:只有两个元素表相匹配的才能在结果集中显示。
外连接:
左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
全外连接:连接的表中不匹配的数据全部会显示出来。
交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。

16.索引是什么?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

17.索引是什么结构?

索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引

18.为什么要用索引?

1.可以大大加快数据的检索速度,这也是常见索引的最主要的原因。
2.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

19.数据库锁知道是什么吗?

相对其他数据库而言,MySQL 的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。MySQL这3种锁的特性可大致归纳如下。

开销、加锁速度、死锁、粒度、并发性能

①:表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率较高,并发度较低。

②:行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率较低,并发度也较高。

③:页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。由于BDB已经被InnoDB取代,即将成为历史(所以现在基本都在使用InnoDB存储引擎)。

20.介绍一下mysql的事务

数据库的事务是指一组sql语句组成的数据库逻辑处理单元,在这组的sql操作中,要么全部执行成功,要么全部执行失败
这里的一组sql操作,举个简单又经典的例子就是转账了,事务A中要进行转账,那么转出的账号要扣钱,转入的账号要加钱,这两个操作都必须同时执行成功,为了确保数据的一致性。

事务的四大特性:

在Mysql中事务的四大特性主要包含:原子性(Atomicity)、一致性(Consistent)、隔离性(Isalotion)、持久性(Durable),简称为ACID。

原子性:

原子性是指事务的原子性操作,对数据的修改要么全部执行成功,要么全部失败,实现事务的原子性,(是基于日志的Redo/Undo机制)。

一致性:

一致性是指执行事务前后的状态要一致,可以理解为数据一致性。隔离性侧重指事务之间相互隔离,不受影响,这个与事务设置的隔离级别有密切的关系。

持久性:

持久性则是指在一个事务提交后,这个事务的状态会被持久化到数据库中,也就是事务提交,对数据的新增、更新将会持久化到书库中。

隔离性:

我: 可以的,在Mysql中事务的隔离级别分为四大等级,读未提交(READ UNCOMMITTED)、读提交 (READ COMMITTED)、可重复读 (REPEATABLE READ)、串行化 (SERIALIZABLE)。

我: 读未提交会读到另一个事务的未提交的数据,产生脏读问题,读提交则解决了脏读的,出现了不可重复读,即在一个事务任意时刻读到的数据可能不一样,可能会受到其它事务对数据修改提交后的影响,一般是对于update的操作。

我: 可重复读解决了之前不可重复读和脏读的问题,但是由带来了幻读的问题,幻读一般是针对inser操作。

我: 例如:第一个事务查询一个User表id=100发现不存在该数据行,这时第二个事务又进来了,新增了一条id=100的数据行并且提交了事务。

我: 这时第一个事务新增一条id=100的数据行会报主键冲突,第一个事务再select一下,发现id=100数据行已经存在,这就是幻读。

21.索引越多越好吗?可能出现什么问题?

1.数据量小的表不需要建立索引,建立会增加额外的索引开销
2.不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义。对经常用于查询的字段应该创建索引。
3.经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率
4.数据重复且分布平均的字段,因此他建立索引就没有太大的效果(例如性别字段,是否上架等等,不适合建立索引)
5.数据变更需要维护索引,意味着索引越多维护成本越高。当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。
6.更多的索引也需要更多的存储空间,一个表中很够创建多个索引,这些索引度会被存放到一个索引文件中(专门存放索引的地方)。

22.顺便说一下索引的相关知识:

索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,所以索引还是很有用的,其中MySQL中的索引的存储类型有两种:BTREE、HASH,平时我们经常见到的基本都是b+树。
MyISAM(非聚簇索引)和InnoDB(聚簇索引)存储引擎:只支持BTREE索引, 也就是说默认使用BTREE,这也是我们经常见到的,不能够更换MEMORY/HEAP存储引擎:支持HASH和BTREE索引。(上面的聚簇索引和非聚簇索引,可以这么区分,聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。)

23.索引我们分为四类来讲 单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引。这里我们只说说第一个和第二个。

单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 这里不要搞混淆了。
普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
唯一索引:索引列中的值必须是唯一的,但是允许为空值。
主键索引:是一种特殊的唯一索引,不允许有空值。
组合索引:(也叫联合索引(多列联合))
在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。例子如下:
联合索引 (a,b,c) 实际建立了 (a)、(a,b)、(a,b,c) 三个索引

24.数据库的日志有哪些?

路过记得点赞🙃🙃