268. 进程之间的通信方式有哪些?
- 管道(Pipe)
- 信号(Signal)
- 消息队列(Message Queue)
- 共享内存(Shared Memory)
- 信号量(Semaphore)
- 套接字(Socket)
269. 两个进程想用同一个端口可以做到么?
通常情况下,同一时间内两个进程不能监听同一个端口。
但如果第二个进程设置了SO_REUSEADDR
或SO_REUSEPORT
套接字选项,则可能允许绑定到同一个接口,这取决于操作系统的实现。
270. TimeWait是干嘛的?是主动断开方的状态还是被动段开方的状态?
TIME_WAIT是TCP连接断开流程中的一个状态,他是主动关闭方在发送最后一个ACK应答后进入的状态。这个状态的作用是确保最后一个ACK能到达对方,避免由于网络延迟导致的连接重置,以及确保所有旧的数据包在网络上消失,防止他们干扰新的连接。
271. 出现大量time wait怎么继续用端口快速建立连接
大量的TIME_WAIT 状态可能会使新的连接无法立即使用这些端口。为了解决这个问题,可以采取以下措施:
- 开启TCP的timewait复用功能,可以设置
/proc/sys/net/ipv4/tcp_tw_reuse
为1。 - 减小TIME_WAIT的超时时间,可以调整
/proc/sys/net/ipv4/tcp_fin_timeout
的值。这个值代表TCP连接在结束后还需要等待多久才能被完全释放。 - 使用不同的本地端口进行连接,通过在较大范围内选择源端口,这样可以避免端口用尽的情况。
272. socket有个参数可以重用连接,了解吗?
存在两个套接字选项可以影响连接的重用:
SO_REUSEADDR
:允许其他套接字绑定到正在使用中或TIME_WAIT状态的端口。这对于服务器快速重启非常有用,不必等待端口从TIME_WAIT状态中解除。SO_REUSEPORT
(取决于操作系统支持):允许多个套接字实例在相同的端口上监听,分担入站连接。这有助于在多核处理器上实现负载均衡。
273. Innodb索引
InnoDB是MySQL的一个存储引擎,它使用的主要索引类型是B+树索引,包括两种:
- 主键索引:直接存储数据行的实际内容。在InnoDB中,表数据按主键顺序组织存储。
- 辅助索引:存储主键的值以及指向对应的数据行的指针,不直接包含行数据。查询时,先通过辅助索引找到主键,再通过主键索引定位到数据行。
解释:
要理解 InnoDB 的索引机制,首先要了解它的存储和索引结构。
InnoDB的存储和索引结构
InnoDB 是 MySQL 的一种存储引擎,它支持事务和行级锁定,并且它的数据和索引都存储在一种称为 B+ 树的数据结构中。B+ 树是一种平衡的树结构,适用于数据库的高效查找、插入和删除操作。
主键索引
-
主键索引(Clustered Index):
- InnoDB 使用主键索引来组织和存储数据。在 InnoDB 中,主键索引不仅仅是一个索引,它还包含了实际的数据行。
- 数据库表的数据行按照主键的顺序存储在一起。主键索引中的叶子节点包含了完整的数据行。
- 由于数据行按主键顺序存储,因此在通过主键进行查询时,查找效率非常高。
示例: 假设有一个表
employees
,有主键id
。在 InnoDB 中,数据按照id
的顺序存储:
B+ 树节点(主键索引):
| 1 | 2 | 3 | 4 | 5 |
|数据行|
辅助索引
-
辅助索引(Secondary Index):
- 辅助索引用于加速非主键列上的查询。它们不包含实际的数据行,而是包含主键的值和指向数据行的指针。
- 辅助索引的叶子节点存储的是主键的值。通过辅助索引查找数据时,首先在辅助索引中找到主键的值,然后通过主键索引定位到实际的数据行。
- 辅助索引并不会影响表的数据存储顺序,它只是为查询提供了额外的路径。
示例: 假设有一个表
employees
,有辅助索引name
。在 InnoDB 中,辅助索引存储name
和主键id
:
辅助索引 (name):
| Alice -> 3 |
| Bob -> 1 |
| Charlie -> 2 |主键索引 (id):
| 1 | 2 | 3 |
理解这段话的关键点
- 主键索引存储实际数据行:在 InnoDB 中,主键索引是簇索引,叶子节点包含了实际的数据行。这意味着通过主键索引查找数据行非常高效。
- 表数据按主键顺序存储:InnoDB 表的数据行按主键值的顺序存储,这有助于快速通过主键查找和范围查询。
- 辅助索引存储主键值和指针:辅助索引的叶子节点不包含实际的数据行,而是存储主键值和指向主键索引中相应数据行的指针。查询时,需要先通过辅助索引找到主键值,再通过主键索引找到实际的数据行。
查询过程示例
-
通过主键查询:
- 查询语句:
SELECT * FROM employees WHERE id = 3;
- InnoDB 直接通过主键索引找到数据行,效率高。
- 查询语句:
-
通过辅助索引查询:
- 查询语句:
SELECT * FROM employees WHERE name = 'Alice';
- InnoDB 先在辅助索引中找到
name
为Alice
对应的主键值3
,然后通过主键索引找到主键值3
对应的数据行。
- 查询语句:
总结来说,InnoDB 使用主键索引和辅助索引来高效地组织和查找数据。主键索引直接存储数据行,辅助索引存储主键值并通过主键值指向数据行。这种结构确保了数据存储和查询的高效性。
274. 主键索引和联合索引的区别
- 主键索引:主键索引是表中唯一的,用于保证数据的唯一性。每个表只有一个主键索引。
- 联合索引:联合索引是一种在多个列上创建的索引。是由两个或多个列的值创建一个单一的、有序的索引。
解释:
要理解主键索引和联合索引之间的区别,可以通过以下几个方面进行详细分析:
主键索引
-
唯一性:
- 主键索引是表中唯一的索引,用于保证数据的唯一性。每个表只能有一个主键索引。
- 主键列的值必须唯一且不能为空,这样可以确保每一行数据都能被唯一标识。
-
索引结构:
- 在 InnoDB 中,主键索引是簇索引(Clustered Index),它不仅是索引,还包含了实际的数据行。
- 数据按主键索引的顺序存储在表中,主键索引的叶子节点存储的是完整的数据行。
-
效率:
- 由于数据行按主键值的顺序存储,通过主键索引进行查询非常高效,尤其是范围查询。
联合索引
-
多个列组合:
- 联合索引是基于两个或多个列创建的单一索引。它将这些列的值组合在一起形成一个有序的索引。
- 例如,创建一个包含列
A
和B
的联合索引:CREATE INDEX idx_ab ON table(A, B);
。
-
索引结构:
- 联合索引的叶子节点存储的是联合列的值以及指向数据行的指针(或者主键值)。
- 联合索引在逻辑上是按联合列的顺序进行排列的。
-
查询效率:
- 联合索引可以加速涉及多个列的查询,尤其是联合列的前缀列的查询。
- 例如,如果有联合索引
(A, B)
,查询A
或A
和B
都可以使用这个索引。但是,如果查询只涉及B
列,这个联合索引的效果就不明显了。
举例说明
假设有一个表 employees
,其结构如下:
CREATE TABLE employees (id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT,...
);
主键索引
- 定义:
id
是主键,创建主键索引。 - 用途:主键索引确保
id
的唯一性,并且数据行按id
的顺序存储。 - 示例查询:
SELECT * FROM employees WHERE id = 1;
联合索引
- 定义:创建联合索引
first_name
和last_name
。
CREATE INDEX idx_name ON employees (first_name, last_name);
- 用途:联合索引加速按
first_name
和last_name
组合查询的数据检索。 - 示例查询:
SELECT * FROM employees WHERE first_name = 'John';
SELECT * FROM employees WHERE first_name = 'John' AND last_name = 'Doe';
总结
-
主键索引:
- 是表中唯一的索引,用于保证数据的唯一性。
- 每个表只能有一个主键索引。
- 在 InnoDB 中,主键索引是簇索引,直接存储数据行。
-
联合索引:
- 基于两个或多个列创建的索引。
- 用于加速涉及多个列的查询,特别是按联合列顺序的查询。
- 联合索引的叶子节点存储联合列的值及指向数据行的指针。
通过以上分析,我们可以更好地理解主键索引和联合索引在数据库中的作用和区别。
275. 主键索引在索引表上只存有索引数据嘛
不完全是。InnoDB引擎中,主键索引是一种特殊类型的索引,存储了索引数据以及与之对应的表数据。这意味着,主键索引实际上包含整个表的数据。
276. 事务的隔离级别
- 读未提交(Read Uncommitted):可以读取未被其他事务提交的数据。
- 读已提交(Read Committed):只能读取已被其他事务提交的数据。
- 可重复读(Repeatable Read):在事务开始后,外界对数据库的更新不会影响到本事务的操作。
- 串行化(Seralizable):事务顺利执行,避免并发问题,实现最高级别的隔离。
277. 幻读是什么?
幻读是指在一个事务处理的过程中,由于其他事务插入了新行,当查询重复时,会出现新的、“幻”的数据。这主要在低隔离级别的事务中发生,尤其在非串行化的隔离级别下常见。它与不可重复读类似,但不可重复读通常是指同一行的数据的变化,而幻读是针对由其他事务所插入的新行。
278. 哪个隔离级别可以解决幻读?
串行化(Serializable)隔离级别可以解决幻读问题。在这个隔离级别下,事务是完全串行执行的,因此可以防止幻读,也能防止其他读写冲突的情况。
279. 常用的Linux命令
ls
- 列出目录内容。cd
- 改变目录。pwd
- 显示当前目录的路径。mkdir
- 创建新目录。rmdir
- 删除空目录。rm
- 删除文件或目录。cp
- 复制文件或目录。mv
- 移动或重命名文件或目录。touch
- 创建空文件或修改文件时间戳。chmod
- 改变文件权限。chown
- 改变文件拥有者。grep
- 搜索文件内容。find
- 在目录树中搜索文件。tar
- 打包和解包文件。wget
- 从网络上下载文件。curl
- 传输数据命令。top
- 显示系统任务和资源占用。ps
- 显示当前进程。kill
- 结束进程。sudo
- 以其他用户身份执行命令,通常为超级用户。
linuxcpu_231">280. linux如何查看cpu的核数
查看CPU的核数:
cat/proc/cpuinfo | grep 'cpu cores' | uniq
这个命令会显示CPU核心的数量
281. 说一下文件权限
在Linux系统中,每个文件或目录都有三种基本权限和三个基本的用户类别。
基本权限包括:
- 读取(r):允许文件被读取。
- 写入(w):允许文件被修改。
- 执行(x):允许文件被执行。
基本的用户类别包括:
- 用户(u):文件的所有者。
- 组(g) :包含有权访问该文件的用户的组。
- 其他(o):对该文件没有特权的所有其他用户。
因此,一个文件的权限可能看起来像这样:rwxr-xr–。这表示,文件所有者有读、写、执行权限;同一组的其他用户有读和执行权限;其他所有用户只有读权限。
解释:
通过 rwxr-xr--
权限字符串可以理解:
- 文件所有者(第一组
rwx
):拥有读、写和执行权限。 - 同一组的其他用户(第二组
r-x
):拥有读和执行权限,但没有写权限。 - 其他所有用户(第三组
r--
):只有读权限,没有写和执行权限。
282. 查看日志的命令
查看日志的命令包括:
- cat- 直接查看整个日志文件内容。
- less- 分页查看日志文件内容。
- tail- 查看日志文件的最后几行,常用tail-f实时跟踪最新日志。
- grep- 在日志文件中搜索特定的文本字符串。
- head- 查看日志文件的前几行。