面经(二)

1、spring 相关:

(1)、bean创建过程;

(2)、事务传播机制:

1) requied(默认属性)
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务
2) mandatory 
支持当前事务,如果当前没有事务,就抛出异常。 
3) never
以非事务方式执行,如果当前存在事务,则抛出异常。 
4) not_supported 
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
5) requireds_new
新建事务,如果当前存在事务,把当前事务挂起。 
6) supports
支持当前事务,如果当前没有事务,就以非事务方式执行。 
7) nested
支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 

(3)、AOP 动态代理 区别:jdk动态代理与cglib  比较;

2、mysql 相关:

(1)、索引结构:

1、B树

B树是一种自平衡的搜索树,形式很简单:
(1)多路,非二叉树

(2)每个节点既保存索引,又保存数据

(3)搜索时相当于二分查找
2、B+树
(1)多路非二叉

(2)只有叶子节点保存数据

(3)搜索时相当于二分查找

(4)增加了相邻接点的指向指针。
3、B树和B+树的区别

(1)B+树查询时间复杂度固定是logn,B树查询复杂度最好是 O(1)。

(2)B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

(3)B+树更适合外部存储,也就是磁盘存储。由于内节点无 data 域,每个节点能索引的范围更大更精确

(4)注意这个区别相当重要,是基于(1)(2)(3)的,B树每个节点即保存数据又保存索引,所以磁盘IO的次数很少,B+树只有叶子节点保存,磁盘IO多,但是区间访问比较好。

(2)、聚簇索引和主键索引

聚簇索引的优缺点
  优点:
    1.数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
    2.聚簇索引对于主键的排序查找和范围查找速度非常快
  缺点:
    1.插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
    2.更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般【定义主键为不可更新】。
    3.二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。

辅助索引(非聚簇索引)
  在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。
辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。
  Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。
  辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。
对于Innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则:

       1.如果一个主键被定义了,那么这个主键就是作为聚集索引

       2. 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引

       3. 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。

       4.自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。聚集索引的排序,必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的。 而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生。所以不应该修改聚集索引。

(3)、索引失效:

1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表)

2. 统计信息失效      需要重新搜集统计信息

3. 索引本身失效      需要重建索引

下面是一些不会使用到索引的原因

索引失效 
1) 没有查询条件,或者查询条件没有建立索引 
2) 在查询条件上没有使用引导列 
3) 查询的数量是大表的大部分,应该是30%以上。 
4) 索引本身失效 
5) 查询条件使用函数在索引列上(见12) 
6) 对小表查询 
7) 提示不使用索引 
8) 统计数据不真实 
9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。 
10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20), 
但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效. 
错误的例子:select * from test where tu_mdn=13333333333; 
正确的例子:select * from test where tu_mdn='13333333333'; 
11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等) 
错误的例子:select * from test where id-1=9; 
正确的例子:select * from test where id=10; 
12)使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引. 
错误的例子:select * from test where round(id)=10; 
说明,此时id的索引已经不起作用了 正确的例子:首先建立函数索引, 
create index test_id_fbi_idx on test(round(id)); 
然后 select * from test where round(id)=10; 这时函数索引起作用了 1,<> 2,单独的>,<,(有时会用到,有时不会) 
3,like "%_" 百分号在前. 
4,表没分析. 
5,单独引用复合索引里非第一位置的索引列. 
6,字符型字段为数字时在where条件里不添加引号. 
7,对索引列进行运算.需要建立函数索引. 
8,not in ,not exist. 
9,当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。 
10, 索引失效。 
11,基于cost成本分析(oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上 
12,有时都考虑到了 但就是不走索引,drop了从建试试在 
13,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走 
14,联合索引 is not null 只要在建立的索引列(不分先后)都会走, 
in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时, 
其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候), 
或者=一个值;当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值), 
以上两种情况索引都会走。其他情况不会走。
6、expain
```
概要描述:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值