面试题5-2
一、硬链接与软链接的区别?
硬链接是具有相同inode号的不同名字的文件,删除一个硬链接文件不影响具有相同inode的文件。硬链接只能是对同一文件系统中的文件进行链接。不能对目录进行创建。软链接有自己的inode。文件用户数据块里面存放的内容就是文件的绝对路径。软链接可以用来进行路径化简,也可以解决空间不足的问题。
二、linux文件系统介绍?
Linux文件系统的定义:提供一种对操作系统和计算机系统所有用户数据和程序的存储和访问机制。
文件:一组有结构的信息集合。用户眼里是有逻辑结构的,在系统的眼里是一堆二进制。逻辑结构<->物理结构。
文件的属性:
文件名。
拓展名。
日期和时间。
大小。
用户属性:
Owner
Group
Other
访问控制属性:
read
write
execute
目录:一种保存文件控制信息的数据结构。作用:列出所有文件。增删改文件。一个目录里面,有很多entries,里面每一个条目都是一个文件的控制信息。
文件类型:对于操作系统来说,主要就是ASCII文件,可执行文件。其他的交给APP解决。
前置知识:
硬盘的高级格式化:构建一个文件系统。主要就是构建分区表和目录。分区表:用来划分磁盘。目录记载了FCB。
常见的分区表:不同的分区具有不同的分区表。
a. MBR分区的起始扇区是2048,前面的0~2047是保留扇区,第0号扇区是MBR(512Byte)。MBR扇区包含的是440字节的boot loader。还有64字节的分区表,有4个16字节的条目,所以MBR只能分成4个区(为了超过这个限制,又想出了拓展分区这种概念),还有2个字节的引导签名。如果扇区号(LBA,逻辑块地址)用4个字节来进行编排,那么最大扇区数为\(2^{32}\)个,所以最大支持2T Bytes。
b. GPT分区。其实MBR中,也早就不拿扇区作为单位了,现在都用全局统一标识符(GUID)。GPT分区按照LBA模式进行编排。第0号扇区Protective MBR主要是为了兼容。2-33号扇区都是用来存放分区信息的,一个分区信息占用128个字节,所以可以放下32*4=128个分区。扇区号用8个字节进行标识,所以存下$2^{64} * 512 = 8 $Z Bytes。
du命令:看一下一个文件磁盘占用情况。发现一个文件占用的实际空间比应该占用的磁盘空间大的多(12
bytes的可以占4k的磁盘空间)。这是因为:磁盘的分配是以扇区来进行分配的,但是文件系统进行空间分配的时候是8个扇区(4k)为单位进行空间分配的。这叫一个簇。
stat命令:查看文件的目录项。里面包含文件名,大小,占用扇区数,簇大小。Inode编号,链接数等等。还记录了一些时间和控制信息。这里的inode是什么呢,这叫做索引节点。
文件系统要做什么?首先文件控制块是一种数据结构,叫做FCB,记录的文件的属性,还有对应的数据块的指针。
a. 文件目录:按照名字找到文件。FCB与文件内容的关联,按照名字搜索的效率。这两个问题需要解决。第一个在unix下面是通过名字+inode来解决的。inode就是unix下面的FCB。搜索名字可以通过哈希等方法来解决。这样的好处是目录项只包括了名字+inode。
b. 分配方法:线性分配,优点是快速并且可以随机存取。缺点是容易产生碎片(外部),增加和删除不方便。
链接分配:不需要连续,没有碎片。缺点:一个数据块要有指向下一个数据块的指针,有空间被浪费。有安全风险,因为它可能会断链,且必须从头访问。为了让指针少一点,可以按簇分配。Windows的文件系统就是这么工作的,维护了一个FAT表。FAT文件系统就是只维护一个start block,FAT表可以根据上一个block号,找下一个block号。
索引分配:将文件占用的所有物理块号按照逻辑顺序保存在一张索引表里面,存有索引表的物理块被称为索引块。
优点:随机访问,快速。但是索引块要占用空间。
unix采用的是一个索引分配方案。多级索引,一共有三级索引。所谓的多级索引,就是索引块里面套索引块。有12个直接块。第一级,一个block有512 bytes,一个地址有4Byte。所以可以存128个block。double呢?128*128个。triple的物理块\(128X128X128\)个。但是ext4里面丢掉了多级索引的这种方式。采用的方式是B树的实现方式。
https://blog.csdn.net/stephen_curry300/article/details/128773721
https://zhuanlan.zhihu.com/p/472419492
目录其实也是文件,在ext文件系统中采用了hash btree(htree)来管理。
c.空闲空间管理。用一个bitmap来管理空闲块。还有一种策略是linked list。
linux其实可以支持多个文件系统,在内核中就存在了VFS这种接口。我们需要做的事情就是用它的API,这样就剥离了直接操作文件系统,各个系统之间不兼容的问题。
三、联合索引最左匹配原则。
这个就是说如果建立了(a,b,c)的联合索引。就是已经建立了(a),(a,b),(a,b,c)上的索引。
Explain select* from test where a=1 and b=1;Explain select* from test where b=1 and a=1;
都用到了索引,因为mysql自动优化查询条件来匹配索引。只用b=1会不会用复合索引,答案是会!只要是索引或者满足索引的一部分就可以用index方式扫描。
https://www.cnblogs.com/sochishun/p/14605317.html
四、分库分表
主要包括垂直分库,垂直分表。把高频字段拆出来,避免了IO争抢以及锁表的机率。
水平分库,水平分表。水平分表的时候,按照range+hash取模的方式避免数据热点问题。
https://blog.csdn.net/qq_38173650/article/details/127277497