1、列举一下数据库常见约束?
约束名称 | 描述 |
---|---|
primary key | 主键约束,非空、唯一、索引 |
auto_increment | 自增 |
unique | 自增 |
foreign | 外键 |
null/not null | 空/非空约束 |
default | 默认值 |
zerofill | 零填充 |
comment | 列描述 |
2、索引是什么?有什么用?
索引是一种数据结构,可以帮助我们快速的进行数据的查找。
3、mysql索引采用什么结构存储?
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现是B+树索引。
4、聚簇索引和非聚簇索引的区别
InnoDB的默认数据结构是聚簇索引,而MyISAM是非聚簇索引。
聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。聚集索引存储记录是物理上连续存在,物理存储按照索引排序,而非聚集索引是逻辑上的连续,物理存储并不连续,物理存储不按照索引排序。
聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。
5、MyISAM索引与InnoDB索引的区别?
InnoDB支持事务,而MyISAM不支持
InnoDB支持行级锁,表级锁,锁定力度小并发能力高,而MyISAM支持表级锁定
InnoDB支持MVCC,而MyISAM不支持
InnoDB支持外键,而MyISAM不支持
InnoDB不支持全文索引,而MyISAM支持
6、数据库三大范式是什么
第一范式:每个列都不可以再分
第二范式:非主键列完全依赖于主键,而不能是依赖于主键的一部分
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键
7、索引什么情况下会失效
1、以%开头的LIKE语句,模糊匹配
2、OR语句前后没有同时使用索引
3、数据类型出现隐式转化(如varchar不加单引号可能会自动转换成int类型)
8、什么是数据库事务
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
9、事务有什么特性
原子性:指的是事务是一个不可分割的,要么都执行要么都不执行
一致性:事务必须使得数据库从一个一致性状态到另一个一致性状态
隔离性:指的是一个事务的执行,不能被其他事务所干扰
持久性:指的是一个事务一旦提交了之后,对数据库的改变就是永久的
10、事务的隔离级别有哪些
隔离级别 | 含义 |
---|---|
ISOLATION_DEFAULT | 使用后端数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMITTED | 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读 |
ISOLATION_READ_COMMITTED | 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 |
ISOLATION_REPEATABLE_READ | 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生 |
ISOLATION_SERIALIZABLE | 最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的 |
11、事务的传播机制有哪些
spring定义了7中事务传播机制:
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)
支持当前事务,如果没有事务会创建一个新的事务
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS)
支持当前事务,如果没有事务的话以非事务方式执行
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY)
支持当前事务,如果没有事务抛出异常
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW)
创建一个新的事务并挂起当前事务
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)
以非事务方式执行,如果当前存在事务则将当前事务挂起
NEVER(TransactionDefinition.PROPAGATION_NEVER)
以非事务方式进行,如果存在事务则抛出异常
NESTED(TransactionDefinition.PROPAGATION_NESTED)
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
**区别:**NESTED如果父事务回滚,子事务也回滚。PROPAGATION_REQUIRED父子事务是独立的,父事务回滚,子事务不回滚。
12、什么是幻读,脏读,不可重复读呢?
- 脏读(Dirty reads)——脏读发生在一个事务读取了另一个事务改写但尚未提交的数据时。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
- 不可重复读(Nonrepeatable read)——不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间进行了更新。
- 幻读(Phantom read)——幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录。
13、数据库的乐观锁和悲观锁
悲观锁
是一种以预防的姿态在修改数据之前把数据锁住,然后再进行读写,在他释放锁之前任何人都不能对其数据进行操作。可以完全保证数据的独占性和正确性,但加锁释放锁会造成消耗,所以性能不高,比较适合写入操作比较频繁的场景。
乐观锁
操作数据库时不会加锁,这使得多个任务可以并行的对数据进行操作,只有到数据提交的时候才通过一种机制来校验数据是否存在冲突(一般实现方式是通过加版本号然后进行比对,或者使用时间戳),比较适合读取操作比较频繁的场景。
14、分布式数据库如何搭建
使用mycat
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
15、什么是数据库连接池
C3P0,Druid
数据库连接池 是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。返回给连接池的这些连接并不会关闭(并没有关闭数据库的物理连接,而是把数据库连接释放,归还给了数据库连接池。),而是准备给下一个调用者进行分配。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发、测试及性能调整提供依据。
16、Mysql中有哪几种锁,列举一下?
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
页面锁:开销和加锁时间和锁定粒度介于表锁和行锁之间;会出现死锁;
17、mysql 的内连接、左连接、右连接有什么区别?
内连接:结合两张表的记录,返回相关的查询结果,返回的是两个表的交集部分。
左连接:左连接查询,左表的信息全部展示出来,右表只会展示符合搜索条件的信息,不足的地方记为NULL。
右连接:右连接查询,右表的信息全部展示出来,左表只会展示符合搜索条件的信息,不足的地方记为NULL。
18、查询语句的执行顺序
from
where
group by
select 【distinct】
【having】
order by
limit
19、数据的备份和恢复
备份方案 | 特点 |
---|---|
全量备份 | 对某一段时间的所有数据进行完全拷贝,数据恢复快,备份时间长 |
增量备份 | 在第一次全量备份或增量备份后,只备份被修改的文件 |
差异备份 | 备份自从上次完全备份之后修改过的文件 |
20、mysql优化
- SQL语句中IN包含的值不应过多
- SELECT语句指明字段
- 当只需要一条数据的时候,使用limit 1
- 不建议使用%前缀的模糊查询
- 避免隐式类型转换
- ……
21、存储过程是什么
存储过程是一些预编译的SQL语句。
22、常用的内置函数有哪些
MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。