mysql面试题

1 数据库三范式

范式是数据库具有最小冗余的表结构
1 第一范式 确保每列保持原子性 要求数据库表的每一列多事不可再分割的基本数据项,同一列中不能有多个值,若某一列有多个值,可将该列单独拆分成一个实体,新实体和原实体是一对多的关系
2 第二范式 首先要满足第一范式,并且表中非主键列不存在对主键的部分依赖。二范式在一范式之上更进一层,二范式要确保数据库表中的每一列都要和主键相关,而不能和主键的某部分相关,也就是说在一个数据库表中,一个表只能保存一种数据,不可以把多种数据保存在同一张表内。
3 第三范式 其条件是:满足第二范式、并且表中的列不存在对非主键列的传递依赖,第三范式需要确保数据表中的每一列数据都和主键直接相关、而不能间接相关。

2 为什么用自增列作为主键

在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上了存储了主键索引以及全部的数据,如果主键索引是自增ID,那么只需要向不断向后排列即可。
如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入、数据移动。就会导致产生很多的内存碎片,进而造成插入性能的下降。

3 为什么使用索引什么样的信息能成为索引

快速查询数据 主键或者唯一字段以及普通键
创建唯一索引,保证数据表中每一行数据的唯一性
加速表之间的连接

4 简单描述mysql中,索引 主键 唯一索引 联合索引的区别,从读方面分析对数据库的性能有什么影响

1 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它包含着对数据表里所有记录的引用指针。
2 普通索引(由key活index定义的索引)其唯一任务就是加快对数据的访问素的。
3普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字unnique把它定义为一个唯一索引。唯一索引可以保证数据记录的唯一性。
4索引可以覆盖多个数据列,如index(columnA,columnB)索引,就是联合索引。
5 索引可以极大地提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,需要操作索引文件。
负面影响:创建索引和维护索引需要消耗时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,当对表进行增删改的时候索引也需要动态维护,这样就降低了数据的维护速度。
不宜建立索引的情况:对于查询中很少涉及列或者重复值比较多的列、特殊的数据类型(如 文本)都不建议建立索引。

5 常见的索引原则

选择唯一性索引:唯一性索引的值是唯一的,可以更快速的通过该检索引来确定某条记录。
为经常需要排序 分组 联合查询操作的字段建立索引。
为常做查询条件的字段建立索引。
限制索引的数目:索引越多,更新越长。
尽量使用数据量少的索引:如果索引很长会影响查询的速度,尽量使用前缀来索引
最左前缀匹配原则
尽量选择分区度高的列作为索引:区分度的公式是表示字段不重复的比例索引列不能参与计算,保持列 干净 ,带函数的查询不参与索引,尽量的扩展索引,不新建索引。

6 事务的四大特征:

  1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
  2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
  3. 隔离性:多个事务之间。相互独立。
  4. 一致性:事务操作前后,数据总量不变

7 事务的四种隔离级别:

  1. read uncommitted 读未提交,一个事务可以读取另一个未提交事务的数据。
  2. read committed 读已提交,一个事务要等另一个事务提交后才能读取数据。
  3. Repeatable read 可重复读,读取数据时不允许修改操作。
  4. Serializable序列化 最高事务隔离级别,在该级别下,事务串化顺序执行,可以避免脏读、不可重复读、幻读。这种事务隔离级别效率低,比较消耗数据库性能,一般不使用。
  5. mysql数据库默认的为read committed而oracle数据库只支持Serializable和read committed两种级别。

8 触发器

触发器是一段能自动执行的程序,是一种特殊的存储过程,触发器和普通存储的区别是:触发器是当对某一个表进行操作时触发,Sql Server中触发器分为两类:DML和DDL

9 数据库并发策略

并发控制一般采用三种方法:乐观锁、悲观锁、时间戳

  1. 乐观锁:乐观锁认为一个用户读取数据时,比人不太会去写自己所读的数据;悲观锁则相反,觉得自己读数据库时,别人可能刚好在写自己刚读的数据,持有的是保守态度;时间戳就是不加锁,通过时间戳来控制并发出现的问题。
  2. 悲观锁:在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己读取结束,才允许别人修改数据,或者是自己修改数据的时候,则不允许别人读取,只有提交事务之后,才允许别人访问数据。
  3. 两种锁使用的场景:乐观锁适用于写比较少的情况,冲突很少发生的时候,这样就跳过了开锁,加大了系统的吞吐量,如果是多写的情况,一般会经常发生冲突,则适用悲观锁。
  4. 时间戳:就是在数据库表中单独加一列时间戳,例如"TimeStamp" 每次读出来的时候,把该字段也读出来,当写回去的时候,把该字段+1,提交之前,跟数据库的该字段比较一次,如果比数据库的值大的话,就允许保存,否则不允许保存,这种处理方法虽然不使用数据库系统提供的锁机制,但是这种方法可以大大提高数据库处理的并发量

10 乐观锁的缺点

  1. ABA问题:如果一个变量V初次读取的时候是A值,并且在准备复制的时候检查到它仍然是A值,那我们也无法确定它的值是否被修改,在此期间他的值可能被该为其他值又改回A。
  2. 循环时间长开销大:自旋CAS如果长时间不成功会给cpu带来非常大的开销。
  3. 只能保证一个共享变量的原子操作:CAS只对单个共享变量有效,当操作涉及多个共享变量是CAS无效。

你可能感兴趣的:(数据库,mysql)