史上最全数据库相关面试题(三)

点击上方 "JAVA开发大本营"关注, 置顶或星标一起学习

每天晚上10点00分, 我们不见不散

导读

小编将每天整理10道经典,系统化的面试题,让你进行学习。

每天鸡汤

吾生也有涯,而知也无涯

责任编辑:涛哥

史上最全数据库相关面试题(一)

史上最全数据库相关面试题(二)

二十一、为什么用自增列作为主键

参考回答:

(1)如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。

如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。

如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

(2)数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放。

因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)

(3)如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。

(4)如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新记录都要被插到现有索引页的中间某个位置。

此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销。

同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

二十二、索引类型有哪些?

参考回答:

逻辑上:

(1)Single column 单行索引

(2)Concatenated 多行索引

(3)Unique 唯一索引

(4)NonUnique 非唯一索引

(5)Function-based 函数索引

(6)Domain 域索引 

物理上:

(1)Partitioned 分区索引

(2)NonPartitioned 非分区索引

B-tree :

(1)Normal 正常型B树

(2)Rever Key 反转型B树 Bitmap 位图索引

二十三、MySQL联合索引

参考回答:

(1)联合索引是两个或更多个列上的索引。

对于联合索引,Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。

例如索引是key index (a,b,c). 可以支持a 、 a,b 、 a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

(2)利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。

复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。

如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不知道姓,电话簿将没有用处。

 

二十四、Oracle和Mysql的区别?

参考回答:

(1)库函数不同。 

(2)Oracle是用表空间来管理的,Mysql不是。 

(3)显示当前所有的表、用户、改变连接用户、显示当前连接用户、执行外部脚本的语句的不同。

(4)分页查询时候时候,mysql用limit oracle用rownum

二十五、什么是表分区?

参考回答:


表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

二十六、表分区与分表的区别

参考回答:

分表:指的是通过一定规则,将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。

分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。

二十七、表分区有什么好处?

参考回答:

(1)存储更多数据。分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比,可以存储更多数据

(2)优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。

(3)分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。

(4)避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价你系统的inode锁竞争等。

二十八、分区表的限制因素

参考回答:

(1)一个表最多只能有1024个分区

(2)MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。

(3)如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。

(4)分区表中无法使用外键约束

(5)MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。

二十九、如何判断当前MySQL是否支持分区?

参考回答:

执行命令:

show variables like '%partition%' 

运行结果:

have_partintioning  的值为YES,表示支持分区。

三十、MySQL支持的分区类型有哪些?

参考回答:

(1)RANGE分区:这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区

(2)LIST分区:这种模式允许系统通过预定义的列表的值来对数据进行分割。按照List中的值分区,与RANGE的区别是,range分区的区间范围值是连续的。

(3)HASH分区 :这种模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。

(4)KEY分区 :上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

扫码关注最新动态

关键时刻,第一时间送达

- END -

点个在看是最大的支持 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

carl的分享笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值