数据库的三范式是什么
- 据库表的每一列都是不可分割的原子数据项。
- 要有主键,要求其他字段都依赖于主键。
- 相同的字段只在一个地方存储,不应该出现在多张表中。
事务四大特性(ACID)
- 原子性:一个事务的所有操作要不都成功,要不都失败。
- 一致性:指的是数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态
- 隔离性:不同的事务之间互不干涉。
- 持久性:我们对数据库的任意的操作,增删改,只要事务提交成功,那么结果就是永久性的,不可能因为我们系统宕机或者重启了数据库的服务器,它又恢复到原来的状态了。
char 和 varchar 的区别是什么?
char 类型:长度固定,效率高,占用空间大。
varChar类型:长度是可变的,占用空间小。
float 和 double 的区别是什么?
float:最多可以存储8个十进制数,在内存中占4个字节。
double:最多可以存储16个十进制数,在内存中占8个字节。
Mysql的左、右、内连接的区别
左连接:left join,先把左边的符合条件的数据查询出来,在匹配右边,如果右边没有对应的数据就用null代替。
右连接:right join:先把右边的符合条件的数据查询出来,在匹配右边,如果右边没有对应的数据就用null代替。
内连接:inner join:只有左右两张表的数据都符合条件才会显示出来
mysql 索引是怎么实现的?
inndob的存储引擎使用B+树来实现索引
怎么验证 mysql 的索引是否满足需求
在sql语句前面加上 explain 来查看本条sql语句的执行状态,从而分析你的索引是否满足条件。
说一下数据库的事务隔离
未提交读,已提交读,可重复读,串行化。
脏读、可重复读、幻读。
脏读:读取到事务还没有进行提交的数据。
不可重复读:在同一个事务中,执行相同的sql第一次和第二次查询到的数据不一致。
幻读:在同一个事务中,执行相同的sql第一次和第二次查询到的数据数量不一致。
说一下 mysql 常用的引擎
InnoDB:支持事务,也支持行锁和表锁,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引,在并发的环境下效率更高。
MyIASM:不支持事务,当插入和更新数据时会锁定整张表,MyIsm存储引擎会保存一个变量用来存储总行数,所以执行select count(*) from xx 很快,在读操作很多并且不考虑并发的情况下效率更高。
为什么innodb不用变量来计算行数,因为没有意义,每个事务的行数都不同,没法进行统一保存。
说一下MySQL的行锁和表锁
行锁:行锁其实锁定的是索引,锁的粒度小,效率低,锁冲突概率小。
表锁:锁定的是整张表,锁的粒度大,但是效率低,锁冲突的概率大。
说一下乐观锁和悲观锁?
乐观锁:MVCC 在整张表加了一个 version,记录是第几个事务修改了该表,如果发现version字段不能进行修改。
悲观锁:事务中每次在拿数据的时候都会上锁,别的事务想要修改这个数据就会被阻止,直到这个锁被释放。
说一下共享锁和排他锁
共享锁:当事务在拿数据的时候加了共享锁,那么其他事务就只能查询该数据而不能对该数据进行修改。
排他锁:如果事务对数据加上排他锁后,则其他事务不能再对该数据进行查询或者修改操作,获准排他锁的事务既能读数据,又能修改数据。
如何做 mysql 的性能优化
- 业务逻辑代码
- sql语句与索引
- 表结构(分库分表)
- 分布式架构
- 数据库配置(最大连接数)
- 硬件与操作系统
索引为什么要用B+树,B+树和B树的区别是什么
b树,叶子节点跟非叶子节点都储存数据
b+树,只有在叶子节点储存数据
B树:有序数组 + 平衡多叉树
B+树:有序数组链表 + 平衡多叉树
数据库索引采用B+树的主要原因是B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题,全表查询效率低下,正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且全表查询速度很快。
聚集索引和非聚集索引区别
聚集索引:主键索引,一个表只能有一个,存储记录是物理上连续存在,聚集索引查询数据速度快,插入数据速度慢
非聚集索引:普通索引,一个表可以有多个,非聚集索引是逻辑上的连续物理存储并不连续。非聚集索引查询慢,插入快。
非关系型数据库和关系型数据库区别,优势比较?
优点:
易于维护:都是使用表结构,格式一致; 使用方便:SQL语言通用,可用于复杂查询; 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
读写性能比较差,尤其是海量数据的高效率读写; 固定的表结构,灵活度稍欠; 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
优点:
格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘; 高扩展性; 成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
不提供sql支持,学习和使用成本较高; 无事务处理; 数据结构相对复杂,复杂查询方面稍欠。
mysql的死锁问题
MySQL有两种死锁处理方式:
等待,直到超时(innodb_lock_wait_timeout=50s)。
发起死锁检测,主动回滚一条事务,让其他事务继续执行(innodb_deadlock_detect=on)。
数据库崩溃时事务的恢复机制(REDO日志和UNDO日志)
UNDO_log:在操作任何数据之前,首先将数据保存起来,如果进行了ROLLBACK操作则进行回滚。
REDO_log:Redo Log记录的是事务没提交之前的状态,如果此时数据库崩溃了,就会根据REDO_log进行恢复。
mysql慢查询怎么解决
开启MySQL的慢查询功能,他能把超过多少s的SQL语句保存到文件中,然后对SQL语句进行优化。
B+树索引和哈希索引的明显区别是
哈希索引不支持范围查询,并且无法进行模糊查询,如果hash值重复过多就会造成查询缓慢。
查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序?
where - join - group - having - limit
为什么不使用红黑树
因为增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间
Sql的优化
- 子查询变成left join
- limit 分布优化,先利用ID定位,再分页
- or条件优化,多个or条件可以用union all对结果进行合并(union all结果可能重复)
- 不必要的排序
- where代替having,having 检索完所有记录,才进行过滤
- 避免嵌套查询
- 对多个字段进行等值查询时,联合索引
- 模糊查询使用最左匹配原则。
索引最左前缀问题
最左前缀,如果对三个字段建立联合索引,如果第二个字段没有使用索引,第三个字段也使用不到索引了
索引失效问题
- 条件是or,如果还想让or条件生效,给or每个字段加个索引
- like查询,以%开头
- 内部函数
- 对索引列进行计算
- is null不会用,is not null 会用
数据库连接池的作用
维护一定数量的连接,减少创建连接的时间
更快的响应时间
统一的管理
数据库索引
索引就是根据表中的一列或者若干列按照一定顺序建立的列值与记录行之间的对应关系表,实际上是一张描述索引列的列值与原表中记录行之间一一对应的有序表
MySQL回表
即采用普通索引搜索方式,需要先搜索普通索引树,得到其对应的主键值是3,再到主键索引树搜索一次,这个过程称之为回表
索引覆盖
如果在普通索引树上的查询已经直接提供了结果,不需要回表操作,这样的普通索引叫做覆盖索引。覆盖索引的使用可以显著提高查询效率,是常见的MySQL性能优化手段。
索引下推
可以在索引遍历过程中,对索引中包含的其余字段先做判断,直接过滤掉不满足条件的记录,减少回表次数,提升查询效率。