mysql面试题的一些记录

2018-09-10  本文已影响0人  DamaoShao
  1. 主键,外键,超键,候选键
主键 对表中数据进行唯一标识的数据列的组合;不能缺失;不能空值;
外键 该列为另一表的主键;
超键 关系中能唯一标识数据的属性;
候选键 不含多余属性的超键;
  1. 数据库事务的四个特征及含义
原子性 要么全部完成,要么不完成,若发生错误会进行回滚操作;
一致性 开始到结束后,数据库完整性约束没收到破坏;(实体完整性,参照完整性,用户定义的完整性)
隔离性 事务与事务之间相隔离,串行化执行;
持久性 事务完成对数据的影响是永久的;
  1. 视图的作用,可以更改吗

视图是虚拟的表;只包含动态检索数据的查询,不包含数据;简化操作,隐藏细节,保护数据;对视图的更新会作用于基表,一般不更新;

  1. drop,delete和truncate
drop 表级的删除;不能回滚;
truncate 清空表;不记录单行删除日志;无法恢复;只能对于TABLE操作;不能在带FOREIGN KEY约束的表(被引用的表)中使用;计数从头开始;
delete 配合where删除数据;会记录日志用于回归;会触发触发器;不减少索引和表的空间;
  1. 索引的工作原理和其种类

索引的实现通常采用B树或B+树,加快查询速度也消耗更多空间

唯一索引 不允许任何两行具相同值
主键索引 唯一索引的一种
聚集索引 行的物理顺序和键值的索引顺序相同
普通索引 无限制
全文索引 针对较大的数据生成全文索引很耗时间空间
组合索引 最左前缀原则:若对多列建立组合索引,若第二列未使用索引,则第三列也不会使用
InnoDB 主索引:InnoDB的数据文件本身;辅助索引:相应记录主键的值
MyISAM 索引与数据分离;辅助索引:与主索引无区别;
  1. 数据库范式
范式 内容
1NF 每一列都是不可分割的基本数据项,同一列无二值;无重复的域;
2NF 实例依赖于主键部分;
3NF 属性不依赖于其他非主属性;

首先要明确的是:满足着第三范式,那么就一定满足第二范式、满足着第二范式就一定满足第一范式

学生信息组成学生信息表,有年龄、性别、学号等信息组成。这些字段都不可再分,所以它是满足第一范式的

其他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依赖于主键,也就成了唯一的

学号为1的同学,姓名是damao,年龄是100岁。姓名和年龄字段都依赖着学号主键。

就是数据只在一个地方存储,不重复出现在多张表中,可以认为就是消除传递依赖

比如,我们大学分了很多系(中文系、英语系、计算机系……),这个系别管理表信息有以下字段组成:系编号,系主任,系简介,系架构。那我们能不能在学生信息表添加系编号,系主任,系简介,系架构字段呢?不行的,因为这样就冗余了,非主键外的字段形成了依赖关系(依赖到学生信息表了)!正确的做法是:学生表就只能增加一个系编号字段。

  1. 存储过程与触发器的区别

存储过程和触发器都是SQL语句集;触发器不可用CALL调用,而是在用户执行某些语句后自动调用;

  1. 分表与分区

分表 :真正的分表,每张表对应三个文件;提高MYSQL的并发能力;
分区 :表中的数据分成多个区块;突破磁盘的读写能力;

  1. 数据库隔离级别
脏读 一个事务读取了另一个事务未提交的数据
不可重复读 在一次事务范围内,读取同一数据产生了不同的值
虚读 读取整体的数据后,因其他事务对数据的更新,再次查询时结果不同
串行化 3种均可避免
可重复读(默认) 避免1,2
读已提交 1
读未提交
  1. MYSQL的两种存储引擎
MYISAM 不支持事务,不支持外键,表锁;插入数据时锁定整个表,查行数时无需整表扫描
INNODB 支持事务,外键,行锁,查表总行数时,全表扫描;
  1. MYSQL索引算法
HASH 适合等值查找,不适合范围,不能排序
BTREE 适合范围查找,无hash冲突
  1. 聚集索引和非聚集索引
聚集索引 数据按索引顺序存储,节点存储的是真实数据
非聚集索引 节点存储的是指向真正数据的指针
  1. 索引的优缺点
优点 提高查询效率
缺点 降低了更新效率
  1. 两种存储引擎索引的区别
Innodb 主索引的数据文件本身就是索引文件;辅助索引记录主键的值;
MyISAM 主索引数据文件和索引文件分离;与主索引无区别;
  1. 数据库的主从复制

一个服务器作为主服务器,一个或多个服务器作为从服务器,主服务器将更新写到二进制日志,当一个从服务器连接到主服务器时,通知主服务器读取日志,接收从那时起发生的所有更新。解决:数据分布,负载平衡,备份,高可用性和容错性

基于语句 在主服务器上执行的语句,在从服务器上也执行
基于行 将改变的内容复制过去
混合类型 语句复制失败时采用行的形式
  1. 数据库连接池

为数据库连接建立一个缓冲池,防止过于大量的连接的建立与管理;

  1. 存储过程

存储过程是一些预编译的SQL语句,执行效率较高

  1. 乐观锁和悲观锁
乐观锁 假定不会发生并发冲突,只在提交时检查,若有其他数据更新了数据,则回滚;使用数据版本标示数据(时间戳,版本号)
悲观锁 假定会发生并发冲突,屏蔽一切破坏数据库一致性的操作,主要用于数据争用激烈的环境,以及锁成本低于回滚成本时;排他锁;
  1. 如何设计一个高并发的系统

① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化

② 使用缓存,尽量减少数据库 IO

③ 分布式数据库、分布式缓存

④ 服务器的负载均衡

  1. 什么情况下设置了索引但无法使用

① 以“%”开头的LIKE语句,模糊匹配

② OR语句前后没有同时使用索引

③ 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型

  1. 实践中如何优化MySQL

① SQL语句及索引的优化

② 数据库表结构的优化

③ 系统配置的优化

④ 硬件的优化

  1. 优化数据库的方法

· 选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如'省份'、'性别'最好适用ENUM

· 使用连接(JOIN)来代替子查询

· 适用联合(UNION)来代替手动创建的临时表

· 事务处理

· 锁定表、优化事务处理

· 适用外键,优化锁定表

· 建立索引

· 优化查询语句

  1. 简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。
主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

  1. 数据库中的事务是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。

  1. 对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题

a)、索引的目的是什么?

快速访问数据表中的特定信息,提高检索速度

创建唯一性索引,保证数据库表中每一行数据的唯一性。

加速表和表之间的连接

使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

b)、索引对数据库系统的负面影响是什么?

负面影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

c)、为数据表建立索引的原则有哪些?

在最频繁使用的、用以缩小查询范围的字段上建立索引。

在频繁使用的、需要排序的字段上建立索引

d)、 什么情况下不宜建立索引?

对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。

对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等

  1. 简述在MySQL数据库中MyISAM和InnoDB的区别

区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。

InnoDB与MyISAM的区别:

InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经停止开发)。

特点:

· 行锁设计、支持外键,支持事务,支持并发,锁粒度是支持mvcc得行级锁;

MyISAM存储引擎: 是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。
特点:

不支持事务,锁粒度是支持并发插入得表级锁,支持表所和全文索引。操作速度快,不能读写操作太频繁;

  1. 解释MySQL外连接、内连接与自连接的区别

先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。

内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中
的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。

左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。

  1. 完整性约束包括哪些?

答:数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。

分为以下四类:

  1. 实体完整性:规定表的每一行在表中是惟一的实体。

  2. 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。

  3. 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。

  4. 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。

与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。

  1. 什么是事务?及其特性?

答:事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

事务特性:

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

或者这样理解:

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

  1. 什么叫视图?游标是什么?

答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

(1) 视图能够简化用户的操作 (2) 视图使用户能以多种角度看待同一数据; (3) 视图为数据库提供了一定程度的逻辑独立性; (4) 视图能够对机密数据提供安全保护。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

  1. 什么是存储过程?用什么来调用?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

  1. 主键、外键和索引的区别?

定义:

主键--唯一标识一条记录,不能有重复的,不允许为空

外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值

索引--该字段没有重复值,但可以有一个空值

作用:

主键--用来保证数据完整性

外键--用来和其他表建立联系用的

索引--是提高查询排序的速度

个数:

主键--主键只能有一个

外键--一个表可以有多个外键

索引--一个表可以有多个唯一索引

  1. 对SQL语句优化有哪些方法

(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。

(3) 避免在索引列上使用计算

(4)避免在索引列上使用IS NULL和IS NOT NULL

(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

  1. SQL语句中‘相关子查询’与‘非相关子查询’有什么区别?

答:子查询:嵌套在其他查询中的查询称之。

子查询又称内部,而包含子查询的语句称之外部查询(又称主查询)。

所有的子查询可以分为两类,即相关子查询和非相关子查询

(1)非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

(2)相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。

故非相关子查询比相关子查询效率高

  1. 如何进行SQL优化?

(1)选择正确的存储引擎

以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。

MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。

InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

(2)优化字段的数据类型

记住一个原则,越小的列会越快。如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果你不需要记录时间,使用 DATE 要比 DATETIME 好得多。当然,你也需要留够足够的扩展空间。

(3)为搜索字段添加索引

索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么最好是为其建立索引,除非你要搜索的字段是大的文本字段,那应该建立全文索引。

(4)避免使用Select 从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。即使你要查询数据表的所有字段,也尽量不要用通配符,善用内置提供的字段排除定义也许能给带来更多的便利。

(5)使用 ENUM 而不是 VARCHAR

ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

(6)尽可能的使用 NOT NULL

除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。 NULL其实需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。

(7)固定长度的表会更快

如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理。

固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。

并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。

  1. 大表优化

字段

索引

查询SQL

引擎

目前广泛使用的是MyISAM和InnoDB两种引擎:

MyISAM

MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:

InnoDB

InnoDB在MySQL 5.5后成为默认索引,它的特点是:

总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERTUPDATE密集型的表

缓存

缓存可以发生在这些层次:

可以根据实际情况在一个层次或多个层次结合加入缓存。这里重点介绍下服务层的缓存实现,目前主要有两种方式:

  1. Mysql锁机制

粒度:表级锁和行级锁

分类:

  1. 什么是存储过程?

存储过程就像我们编程语言中的函数一样,封装了我们的代码(PLSQL、T-SQL)

存储过程的优点:

存储过程的缺点:

  1. 什么是视图?

(1)视图是一种虚表

(2)视图建立在已有表的基础上, 视图赖以建立的这些表称为基表

(3)向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起来的 SELECT 语句

(4)视图向用户提供基表数据的另一种表现形式

(5)视图没有存储真正的数据,真正的数据还是存储在基表中

(6)程序员虽然操作的是视图,但最终视图还会转成操作基表

(7)一个基表可以有0个或多个视图

上一篇下一篇

猜你喜欢

热点阅读