面试题总结03

1.ConcurrentHashMap线程安全的具体实现方式是怎样的

JDK1.7
首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据时其他段的数据也能被其他线程访问
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成
Segment实现了RenntrantLock,所以是一个可重入锁,扮演锁的角色
HashEntry用于存储键值对数据
一个ConcurrentHashMap里包含一个Segment数组,Segment的结构跟HashMap结构类似,是一个数组和链表结构,一个Segment包含一个HashEntry,每个HashEntry是一个链表结构元素,每个Segment守护着一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获取对应的Segment锁
JDK1.8
ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全数据结构跟HashMap1.8 的结构类似,数组+链表/红黑二叉树Java8在链表长度超过一定阈值(默认是8)时将链表转换为红黑二叉树,
synchronized只会锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率提高N倍哈希冲突
当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就叫它hash碰撞

2.final和finally及finalize()区别

final 不可改变的 可以用来修饰类,方法,变量
修饰类 不能被继承
修饰方法 不能被重写
修饰变量 不能被改变 通常跟static连用 静态常量
finally 是一个关键字 它经常和try块一起使用,用于异常处理finally部分的代码一定会执行,所以通常用来关闭资源
finalize()是Object对象的一个方法,用于对象垃圾回收方法,这个方法不怎么使用
不管在try还是在catch如果return,那么finally也要执行
当在try或者catch依次执行的时候当看到return
直接执行finally里面的代码,再执行return
如果finally里面有return 那么方法结束,try或者catch里面return失效

3.Mysql事务特性,说一下分别是什么意思

原子性∶即不可分割,事务要么全部成功,要么全部失败
一致性∶事务的执行使数据库从一种状态转换成另外一种正确的状态
隔离性∶在事务正确提交之前,不允许把该事务对数据的任何改变提供给其他事务
持久性∶事务正确提交后,其结果将永久保存在数据库中,即使事务提交后有了其他故障,事务的处理结果也会保存

4.Mysql隔离级别 -可重复读脏读

脏读——读取到了别的事务未提交的数据(因为其还能回滚)
不可重复读——在同一事务中,两次查询到的结果不一致
幻读——明明在查询的结果中未发现要增删改的目标,但是操作显示有该条数据
READ-UNCOMMITTED(读未提交)∶最低的隔离级别,可能会出现脏读,幻读,不可重复
READ-COMMITTED(读已提交)∶只能读取到别的事务提交的数据,能防止脏读,但仍会出现幻读,不可重复读
REPEATABLE-READ(可重复读)∶对同一字段,多次读取结果都是一致的,可以防止不可重复读
SERIALIZABLE(可串行化)∶最高的隔离级别,什么问题都不会出现
不是最高级别的就最好,要在业务允许的范围之内,选择最低的隔离级别
Mysql的默认隔离级别REPEATABLE-READ
Oracle的默认隔离级别READ-COMMITTED

5.什么是慢查询

慢查询,执行很慢的查询
超过long_query_time参数设定的时间阈值(默认10秒),就被认为是慢的,是需要被优化的,慢查询被记录在慢查询日志里面,但是默认是不开启,如果你需要优化SQL,就可以开启这个功能,它可以让你很容易知道哪些语句是需要被优化的
可以根据公司业务要求修改阈值
还可以设置日志存储的位置,通过查看日志,来断定哪些语句修改优化

6.如果查询慢SQL产生的原因

  1. 没有索引或者用到索引
  2. 内存不足
  3. 网络速度慢
  4. 查询出的数据量过大(可以采用多次查询)
  5. 是否返回了不必要的行和列
  6. 锁/死锁

7.对SQL慢查询会考虑哪些优化

  1. 分析语句,是否加载了不必要的字段/数据
  2. 查看SQL涉及的表结构和索引信息
  3. 如果SQL很复杂,优化SQL结构
  4. 按照可能的优化点执行表结构变更,增加索引
  5. 查看优化后的执行时间和执行计划
  6. 如果表数据量太大,可以考虑分表
  7. 利用缓存,减少查询次数

8.什么是索引

索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针
索引是一种数据结构,以协助快速查询,更新数据库中的数据
所用的实现通常使用B树接变种B+树
更通俗的说,索引就相当于目录,为了方便查找书中的内容,通过对内容建立索引形成目录
索引是一个文件,它是要占用物理空间的

9.索引的优缺点

优点:

  1. 可以大大加快数据的检索速度,这个是创建索引的主要原因
  2. 通过使用索引,可以查询的过程中,使用优化隐藏器,提高系统性能

缺点:

  1. 时间方面∶创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加,删除和修改的时候,索引也要动态维护,会降低增删改的执行效率
  2. 空间方面∶索引需要占用物理内存

10.Mysql的索引分类

单值/单列索引

  1. 普通索引∶Mysql中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯属为了查询更快
ALTER TABLE table_name ADD INDEX index_name(column)
  1. 唯一索引∶索引列中的值必须是唯一的,但是允许空值
ALTER TABLE table_name ADD UNIQUE (column)
  1. 主键索引∶是一种特殊的唯一索引,不允许有空值

复合索引
多个字段组合上创建的索引只有在查询条件中使用了这些字段的左边字段时索引才会被使用,使用复合索引时遵循最左侧前缀集合

ALTER TABLE table_name ADD INDEX index_name(column1,column2,column3)

全文索引
解释∶就是在一对文字中,通过某个关键字等,就能够到该字段所属的记录行
只有MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引

ALTER TABLE table_name ADD FULLTEXT(column)

空间索引
空间索引是对空间数据类型的字段建立索引
Mysql中的空间字段有四个,GEOMETTY,POINT,LINESTRING,POLYGON

11.索引失效

  1. like以%开头的索引无效,但是like以&结尾,索引有效
  2. or语句前后没有同时使用索引会失效,当且仅当or语句查询条件的前后均有索引是索引生效
  3. 复合索引,使用的不是第一列索引的时候,索引失效,即最左侧匹配规则
  4. 数据类型出现隐式转换比如varchar不加单引号的时候可能会自动转换成int类型,这个时候索引失效
  5. 在索引列上使用IS NULL或者 IS NOT NULL的时候,索引失效,因为索引是不索引空间的
  6. 在索引字段上使用 NOT 、<> 、!=时候不会使用索引的,对于这样的处理只会进行全表扫描
  7. 对索引字段进行计算操作,函数操作时不会使用索引
  8. 当全表扫描速度比索引速度快的时候不会使用索引

12.临时表

MySQL在执行sql语句的过程中,通常会创建一些存储中间结果集的表,就是临时表
临时表只对当前连接可见,当连接关闭时,临时表会被删除并释放所有表空间

13.谈谈SQL优化的经验

  1. 查询语句无论是哪种判断条件,等于,小于,大于,where左侧条件查询字段不要使用函数或者表达式
  2. 当你的SELECT查询语句只需要使用一条记录时,要是用LIMIT1不要使用SELECT *,而应该使用具体查询的表字段,避免全表扫描
  3. 为每一张表设置一个ID属性
  4. 判断避免在WHERE中使用!或者>操作符
  5. 使用BEWEEN AND 替代 IN
  6. 为搜索字段创建索引
  7. 使用LIKE %abc%不会走索引 LIKE abc% 会走索引
  8. 拆分大的DELETE或者INSERT
  9. 选择合适的字段类型,选择标准是尽可能的小,尽可能定长,尽可能使用整数
  10. 字段设计尽可能使用过 NOT NULL
  11. 索引失效会影响查询效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值