Java面试--MySQL

MySQL

1.数据库常见的几种引擎?

  • MyISAM:全表锁,不支持事务和外键;
  • InnoDB:行级锁,支持事务和外键;
  • Memory:内存操作,读写快,但重启会丢失数据,不支持事务和外键;

2.什么是事务?

事务是对数据库中进行一系列回滚或提交的操作,用来保存数据的完整性和一致性。

3.事务四大特性?

ACID

  • A:原子性:要么全部成功全部失败;
  • C:一致性:事务执行前后原本数据库一致数据仍然一致;
  • I:隔离性:事务和事务之间不干涉;
  • D:持久性:事务一旦提交,对数据库中的数据改变是永久的.

4.脏读?不可重复读?幻读?

  • 脏读:也叫“读未提交”读到的数据是错误的,是读到事务还没提交的数据。
  • 不可重复读:一个事务多次读同一个数据却得到不同的结果。例:A先读取一个数据12,B事务修改数据13,随后事务A又读了数据两次结果不同。
  • 幻读:第一次读取到的结果数量和第二次读取结果数量不一致。例:A读取一个表中全部数据数量得到1,随后B删除数据后提交然后A再读数据两次总数不一样。
  • 注:不可重复读和脏读是基于数据内容的错误,幻读是基于数据总量的错误

5.事务的隔离级别?

  • 读未提交:该隔离级别,所有事务可以读到其它未提交事务的执行结果。读取未提交的数据也是脏读
  • 读已取提交:一个事务只能看见已经提交事务对数据的改变。解决脏读。
  • 可重复读:mysql默认隔离级别,同一个事务在并发读取数据时会看到同样的数据。但是幻读无法解决,解决脏读和不可重复读
  • 可串行化:最高隔离级别,它在每个读数据行上加共享锁,不能相互冲突,解决幻读。可以解决所有事务错误

6.什么是索引?

索引是一种高效获取数据的数据结构,相当于目录,占用物理空间。默认B+树结构,或者hash结构

7.索引的数据类型?

默认B+树结构:
①b+树数据都存放在叶子节点中,非叶子节点就可以存放大量索引数据,这样树的层次就越少,io次数减少。
②b+树所有叶子节点是相连的形成一个双向链表。
③因为索引和数据分开存储,不用全表扫描并且是一个顺序读取数据的过程。

8.索引有哪几类?

分为聚簇索引(主键索引)和非聚簇索引(非主键索引)。
1.唯一索引(索引值必须唯一,允许索引字段为空)
2.普通索引(基本索引类型,允许索引为空且重复)
3.主键索引(索引值唯一不为空)
4.复合索引(多个字段加索引,遵循最左匹配原则)

9.复合索引?

在查询条件是多个的时候,推荐使用。因能覆盖更多的索引,并且能极大减少回表带来的性能开销。

10.什么叫回表?

回表:通过辅助索引没有拿到我们想要的数据,拿到主键去聚簇索引查询这个过程叫回表。

11.什么叫索引覆盖?

索引覆盖:从辅助索引能直接拿到我们想要的数据就是索引覆盖。

12.聚簇索引和非聚簇索引?

  • 聚簇索引:就是将一行一行的数据和索引结构放在一起,叶子节点存储的就是行数据。innodb存储索引使用的就是聚簇索引,聚簇索引又默认主键作为索引。
  • 非聚簇索引:非聚簇索引又叫辅助索引。叶子节点存储的不是行数据而是主键ID。

13.最左匹配原则?

从最左索引开始匹配任何连续的索引都能匹配上,但遇到范围查询就让后面范围的索引失效。例:复合索引(a,b.c.d) 条件 a=1 and b=2 and c>3 and d=4 这样d索引用不到。

14.为何推荐自增主键作为索引?

因uuid值太过分散,新增字段可能会插在树中间位置,这样会不断的调整数据地址。而自增只需要一页一页的写,磁盘碎片少效率也高。

15.什么情况下适合建索引?什么情况下不适合检索?

  • 适合:
    1.频繁作为where查询条件字段。
    2.表关联字段。
    3.排序的字段。
    4.用作统计的字段
  • 不适合:
    1.频繁更新的字段。
    2.重复比较多的字段不适合。
    3.参与计算的字段。
    4.可以确定数据比较少的表。

16.索引失效的几种情况?

  1. like查询以%开头的,会导致查询结果无序;
  2. 不遵循最左匹配原则;
  3. 全表扫描快于索引查询;
  4. 条件中有or而or连接字段有没有索引的也会失效,因为没有索引会走全表扫描,这样还不如一开始就全表扫描。

17.常见的几种索引优化?

  1. 尽量不用select * 避免大量回表。
  2. 少用子查询,避免产生笛卡尔集
  3. 尽量使用自增主键,避免碎片多。
  4. 需要用到辅助索引尽量索引覆盖,不要回表。
  5. 多使用复合索引减少回表。

18.sql执行顺序?

8.select 数据 9.distinct(去重字段) 6.聚合函数 
1.from 表名
3.inner|left|right join 表名
2.on 条件
4.where 条件
5.group by
7.having 过滤条件
10.order by 要排序字段
11.limit 开始的行数,每页返回的行数

19.怎么优化sql语句?

①不要用select * 要使用具体字段。
②避免返回大量数据,能用分页最好。
③使用索引提升查询速度,索引字段要设计好。
④避免子查询,连表。

20.Mysql中char和varchar区别?

char长度固定,varchar长度可变。char效率高于varchar

21.什么情况下行锁升级为表锁?

①行锁是建立在索引基础上;
②在未加索引和索引失效的情况下会升级成表锁。

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值