Java面试-MySQL篇

1. 数据库的三范式是什么?

第一范式:列不可再分
第二范式:行可以唯一区分,主键约束
第三范式:表的非主属性不能依赖于其他表的非主属性,外键约束
且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立在第一第二范式上。

2. MySQL数据库引擎有哪些?

  1. 如何查看mysql提供的所有存储引擎
show engines;
  1. mysql常用引擎包括:MYISAM,InnoDB,memory,merge
- MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事物完成ing没有要求,以select,insert为主的应用基本上可以使用这引擎
- innodb:行级锁,提供了具有提交,回滚和崩溃恢复能力的事务安全,支持自动增长列,支持外键约束,并发能力强,占用空间是MYISAM的2.5倍,处理效率会相对差一些
- Memory:全表锁,存储在内容中,速度快,但会占用和数据量成正比的内存空间且数据在mysql重启时会丢失,默认使用hash索引,检索效率非常高但不适用于精确查找,主要用于哪些内容变化不频繁的代码表
- MERGE:是一组MYISAM表的组合

3. 说说InnoDB与MyISAM的区别

  1. innoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语句都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语句放在begin和commit之间,组成一个事务;
  2. innoDB支持外键,而MyISAM不支持。对一个包含外键的innoDB表转为MYISAM会失败
  3. innoDB是聚集索引,数据文件和索引是帮在一起的,必须要有逐渐,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的
  4. innoDB不保存表的具体行数,执行select count(*) from table 时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快
  5. innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高。

4. 数据库的事务

  1. 什么是事务?
    多条sql语句,要么全部成功,要么全部失败
  2. 事务的特性:
    原子性,一致性,隔离性,持久性。简称ACID
- 原子性:组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有操作都成功,整个事务才会提交。任何一个操作失败,已经执行的任何操作都必须撤销,让数据库返回初始状态。
- 一致性:实务操作成功后,数据库所处的状态和它的业务规则是一致的。即数据不会被破坏。
- 隔离性:在并发数据操作时,不同的事务拥有各自的数据空间,他们的操作不会对彼此产生干扰
- 持久性:一旦事务提交成功,事务中的所有操作都必须持久化到数据库中

5. 索引是什么?

  1. 是帮助MySQL高效获取数据的数据结构。能加快数据库的查询速度
  2. 索引往往是存储在磁盘上的文件中的
  3. 我们通常所说的索引,包括聚集索引,覆盖索引,组合索引,前缀索引,唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树)的索引。

6.SQL优化手段有哪些?

  1. 查询语句中不要使用select *
  2. 尽量减少子查询,使用关联查询(left join,right join,inner join)替代
  3. 减少使用IN或者NOT IN,使用exists,not exists或者关联查询语句替代
  4. or的查询尽量用union或者union all代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)
  5. 应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描
  6. 多使用组合索引

7. 简单说一说drop,delete,truncate的区别

- delete和truncate只删除表的数据不删除表的结构
- 速度:一般来说,drop>truncate>delete

8. 什么是视图?

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

9. 什么是内连接,左外连接,右外连接?

- 内连接:匹配2张表中相关联的记录
- 左外连接:除了匹配2张表中相关联的记录外,还会匹配坐标中剩余的记录,右表中未匹配到的字段用NULL表示
- 右外连接:除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记录,坐标中未匹配到的字段用NULL表示

10. 并发事务带来哪些问题?

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题:

  1. 脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问到了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的
  2. 丢失修改:指在一个事务读取到一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据,这样第一个事务内的修改结果就被丢失,因此成为丢失修改。
  3. 不可重复读:指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务读取的数据可能不太一样。这样就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读、
  4. 幻读:幻读与不可重复读类似。它发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
    不可重复读和幻读的区别
    不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除,比如多次读取一条记录发现记录增多或减少了。

11. 事务隔离级别有哪些?MySQL的默认隔离级别是?

12. 大表如何优化?

15. 索引有什么优缺点

  • 优点:
- 提高数据的检索速度,降低数据库IO成本
- 降低数据排序的成本,降低CPU消耗:索引之所以查的快,是因为先将数据排好序,若该字段正好需要排序,则降低了排序的成本
  • 缺点
- 占用存储空间,实际上索引也是一张表,记录了主键和索引字段,一般以索引文件的形式存储在磁盘上
- 降低表的速度:表的数据发生了变化,对应的索引也需要一起变更,从而降低更新速度。否则索引值选哪个的物理数据可能不对,这也是索引失效的原因之一

16. MySQL中varchar与char的区别?varchar(30)中的30代表的含义?

  • varchar与char的区别,char是一种固定长度的类型,varchar则是一种可变长度的类型
  • varchar(30)中30的含义最多存放30个字符。varchar(30)和(130)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为ORDER BY col采用fixed_length计算col长度(memory引擎也一样)
  • 对效率要求高用char,对空间使用要求高用varchar

17. int(11)中11代表什么含义?

int(11)中的11,不影响字段存储的范围,只影响展示效果。

19. 说说innoDB与MyISAM有什么区别?

  • 在5.1及之前的版本中,MyISAM是默认存储引擎,而在5.5之后,默认使用innoDB存储引擎
  • MyISAM不支持行级锁,换句话说,MyISAM会对整张表加锁,而不是针对行。同时,MyISAM不支持事务和外键。MyISAM可被压缩,存储空间较小,而且MyISAM在筛选大量数据时非常快
  • InnoDB说事务型存储引擎,当事务异常提交时,会被回滚。同时,InnoDB支持行锁。此外,InnoDB需要更多存储空间,会在内存中建立其专用的缓存池用于高速缓冲数据和索引。
  • InnoDB支持崩溃恢复特性
    一般情况下,优先使用InnoDB存储引擎,并且尽量不要将InnoDB与MyISAM混合使用

20. MySQL索引类型有哪些?

  1. 主键索引
    索引列中的值必须是唯一的,不允许有空值。
  2. 普通索引
    MySQL中基本索引类型,没有什么限制,允许在定义索引列中插入重复值和空值。
  3. 唯一索引
    索引列中的值必须是唯一的,但是允许为空值
  4. 全文索引
    只能在文本类型char,varchar,text类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这是可以创建全文索引。M和I都可以使用全文索引
  5. 空间索引
    MySQL在5.7之后的版本支持了空间索引
  6. 前缀索引
    在文本类型如char,varchar,text类型上创建索引时,可以指定索引列的长度,但是数值类型不能指定。
  • 其他(按照索引列数量分类)
	- 单列索引
	- 组合索引
		组合索引的使用,需要遵循最左前缀匹配原则(最左匹配规则)。一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用

21. 什么情况下不要使用索引?

  1. 经常增删改的列不要建立索引
  2. 有大量重复的列不建立索引
  3. 表记录太少不要建立索引

29. 怎样避免死锁的出现?

  1. 设置获取锁的超时时间,至少能保证最差情况下,可以退出程序,不至于一直等待导致死锁;
  2. 设置按照统一顺序访问资源,类似于串行执行;
  3. 避免事务中的用户交叉;
  4. 保持事务简短并在一个批处理中;
  5. 使用低隔离级别;
  6. 使用绑定链接

30. 使用MySQL的索引应该注意些什么?

在这里插入图片描述

--------------------------------------战术分割----------------------------------------------

31. MySQL中有哪几种锁?

  1. 表级锁:开销小,加锁快;不会出现死锁;锁的粒度大,发生锁冲突的概率最高,并发读最低。
  2. 行级锁:开销大,加锁慢;会出现死锁;锁的粒度最小,发生锁冲突的概率最低,并发度也最高。
  3. 页面锁:开销和加锁时间介于表锁和行锁之间;会出现死锁;锁的粒度介于表锁和行锁之间,并发读一般。

32. MySQL中有哪些不同的表格?

共有5中类型的表格

MyISAM  Heap  Merge  INNODB  ISAM

33. 简述在MySQL数据库中MyISAM和INNODB的区别?

MyISAM:

- 不支持事务,但是每次查询都是原子的
- 支持表级锁,即每次操作都是对整个表加锁;
- 存储表的总行数;
- 一个MYISAM表有三个文件:索引文件,表结构问及哎你,数据文件;
- 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致。但是辅索引不保证唯一性。

InnoDB:

- 支持ACID事务,支持事务的四种隔离级别
- 支持行级锁及外键约束:因此可以支持写并发

不存储总行数:

  • 一个InnoDB引擎存储在一个空间文件(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表,表大小受操作系统文件大小限制,一般为2G)
  • 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据源存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,在访问辅索引;最高使用自增主键,为防止插入数据时,为维持B+树结构,文件的大调整

34. LIKE声明中的%和_是什么意思?

%对应于0个或更多字符,_只是like语句中的一个字符。
如何在unix和MySQL时间戳之间进行转换?
UNIX_TIMESTAMP是从MySQL时间戳转换为Unix时间戳的命令
FROM_UNIXTIME是从Unix时间戳转换为MySQL时间戳的命令

35. BLOB和text有什么区别?

blob是一个二进制对象,可以容纳可变数量的数据。text是一个不区分大小写的blob
blob和text类型之间的唯一区别在于对blob值进行排序和比较时区大小写,对text值不区分大小写

36. MyISAM表格将在哪里存储,并且还提供其存储格式?

每个MyISAM表格以三种格式存储在磁盘上

  • ".frm"文件存储表定义
  • 数据文件具有".MYD"(MYData)扩展名
  • 索引文件具有".MYI"(MYIndex)扩展名

37. MySQL如何优化distinct?

distinct在所有列上转换为group by,并与order by子句结合使用

select distinct t1.a from t1,t2 where t1.a = t2.a;

38. 如何显示前50行?

在MySQL中,使用以下代码显示前50行:

select * from
limit 0,50;

39. 可以使用多少列创建索引?

任何标准表最多可以创建16个索引列。

40. now()和current_date()有什么区别?

now()命令用于显示当前年份,月份,日期,小时,分钟和秒
current_date()仅显示当前年份,月份和日期

41. 什么是非标准字符串类型

1. tinytext
2. text
3. mediumtext
4. longtext

42. 什么是通用sql函数?

1. concat(A,B) -连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段
2. format(X,D)   格式化数字X到D有效数字
3. CURRDATE(),CURRTIME()	-返回当前日期或时间
4. NOW()		-将当前日期和时间作为一个值返回
5. datediff(A,B)	确定两个日期之间的差异,通常用于计算年龄
6. subtimes(A,B)	确定两次之间的差异
7. fromdays(int)	将证书天数转换为日期值

43. MySQL支持事务吗?

在缺省模式下,MySQL是

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值