您的当前位置:首页正文

面试题整理 2

2024-11-25 来源:个人技术集锦


变量赋值判断

$a = null;
$b = $a;
$c = false;
$d = $c;
var_dump(isset($a), empty($b), isset($c), empty($d));

结果:

bool(false) bool(true) bool(true) bool(true)

变量+=判断

$a = [0, 1, 2, 3];
$b = [1, 2, 3, 4];
$a += $b;
print_r($a);

结果:

Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 )

Foreach使用

$arr = [1, 2, 3, 4];
foreach ($arr as &$V) {

}
foreach ($arr as $v) {

}
print_r($arr);

结果:

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )

Mysql优化策略

合理的索引设计

使用索引:在常用的查询条件(如WHERE、JOIN、ORDER BY 和 GROUP BY)上创建索引。

复合索引:对多个列的查询条件创建复合索引,以减少索引的数量和提高查询性能。

避免过度索引:过多的索引会增加写入操作的负担,影响性能,因此要合理选择索引。

查询优化

使用 EXPLAIN:在运行查询之前,使用 EXPLAIN 了解查询的执行计划,帮助识别瓶颈。

避免 SELECT *:选择必要的列,减少返回的数据量,提高查询效率。

使用 WHERE 条件:尽量添加 WHERE 条件,减少读取的数据量。

小表驱动大表: 尽量使用小表去关联大表,减少关联数据

数据表结构设计

合理的数据类型:选择合适的数据类型,可以减少存储空间并提高性能。例如,尽量使用 INT 而不是 BIGINT,以及选择最合适的字符串类型。

规范化与反规范化:在设计表结构时根据实际情况考虑规范化(消除冗余)与反规范化(提高查询效率)。

分区表(Partitioning):对于大型表,使用分区可以提高查询效率和管理性能。

大表进行拆分:比如一个大表,里面有很多的text,MEDIUMTEXT,LONGTEXT,这种可以抽取关键字段,然后引用大表的主键ID,方便报表需求开发。

配置优化

调整内存设置:根据应用程序的需求,适当调整 MySQL 的内存配置,如 innodb_buffer_pool_size(对于 InnoDB 存储引擎)来提高性能。

设置查询缓存:对于频繁查询的结果,可以启用查询缓存(虽然在新的 MySQL 版本中,查询缓存已被弃用,需谨慎使用)。

监控和调优服务器参数:定期监控 MySQL 的性能指标,并根据需求调整配置,如连接数、线程数等。

合理使用事务

控制事务的范围:尽量将事务控制在最小的范围内,减少对资源的占用。

使用适当的事务隔离级别:根据需求选择合适的事务隔离级别,以平衡性能与一致性。

IO和HTTP不要在同一个事务之内:这么做是为了避免,事务在回滚的时候,某一操作不可逆。

定期维护数据库

分析和优化表:定期运行 ANALYZE TABLE 和 OPTIMIZE TABLE 来更新统计信息和整理表的碎片。

清理无用数据:定期删除或归档旧数据,保持数据库的有效性和性能。

使用缓存

应用层缓存:使用 Redis 或 Memcached 等缓存系统来减轻数据库的负担,提高响应速度。

数据缓存:将频繁访问的数据缓存在内存中,减少对数据库的直接查询。

监控与性能分析

使用监控工具:借助如 MySQL Enterprise Monitor、Percona Toolkit 等工具监控数据库性能。

慢查询日志:启用慢查询日志以识别性能瓶颈,并对相关查询进行优化。

Redis主从复制

介绍

Redis主从复制是一个多Redis实例进行数据同步的过程,其中一个实例是主实例(Master),其他实例是从实例(Slave)。主实例负责处理命令请求,而从实例则 periodically 地从主实例拉取数据副本。

配置

要配置Redis主从复制,需要在从实例的配置文件中设置 slaveof 指令,指向主实例的IP和端口。

例如,假设主实例运行在IP 192.168.1.100 的6379端口上,可以在从实例的配置文件中添加如下行:

slaveof 192.168.1.100 6379

或者,你也可以在从实例启动时通过命令行参数设置:

redis-server --slaveof 192.168.1.100 6379

当配置生效后,从实例会连接到主实例,并开始接收数据。如果主实例发生故障,从实例可以配置为自动进行故障转移,这需要设置 slave-serve-stale-data 为 yes 并启用 slave-read-only 选项。

示例

以下是一个简单的例子,展示如何在Redis配置文件中启用主从复制:

# 主实例的配置文件(无需更改)

# 从实例的配置文件

slaveof 192.168.1.100 6379

slave-serve-stale-data yes

slave-read-only yes

记得在修改配置后重启Redis实例以使配置生效。

Redis 数据类型及应用

string

常用命令

除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作:

获取字符串长度

往字符串append内容

设置和获取字符串的某一段内容

设置及获取字符串的某一位(bit)

批量设置一系列字符串的内容

应用场景

String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,

hash

常用命令

hget,hset,hgetall 等。

应用场景

比如我们要存储一个用户信息对象数据,包含以下信息:

用户ID,为查找的key,

存储的value用户对象包含姓名name,年龄age,生日birthday 等信息

list

常用命令

lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等。

应用场景

可以轻松地实现最新消息排行等功能。

List的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。

set

常用命令

sadd,srem,spop,sdiff ,smembers,sunion 等。

应用场景

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。

Redis还为集合提供了求交集、并集、差集等操作

zset

常用命令

zadd,zrange,zrem,zcard等

应用场景

以某个条件为权重,比如按顶的次数排序.

ZREVRANGE命令可以用来按照得分来获取前100名的用户,ZRANK可以用来获取用户排名,非常直接而且操作容易。

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。

比如:全班同学成绩,value可以是同学的学号,而score就可以是其考试得分,这样数据插入集合的,就已经进行了天然的排序。

Mysql 事务级别

在 MySQL中事务的隔离级别有以下 4 种:

    读未提交(READ UNCOMMITTED)

    读已提交(READ COMMITTED)

    可重复读(REPEATABLE READ)

    序列化(SERIALIZABLE)

MySQL 默认的事务隔离级别是可重复读,这4种隔离级别的说明如下。

1.READ UNCOMMITTED

读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。

2.READ COMMITTED

读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL查询中,可能会得到不同的结果,这种现象叫做不可重复读。

3.REPEATABLE READ

可重复读,是MySQL的默认事务隔离级别,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但就是插入不进去,这就叫幻读 (Phantom Read)。

4.SERIALIZABLE

序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

大数据量统计

一亿条订单数据属于1000个商户,取出订单量最多的前10家商户

如果直接使用一条sql来查出来,

无疑是非常慢并且损耗系统性能的,

设置数据库可能会崩溃。

可以分为两步来执行。

下面介绍实现思路:

首先数据表增加字段

在订单表中增加一个是否处理的标识,

在商户表中增加一个订单量字段用来存储该商户的下单量;

第一步分批次的每次拿一定订单数据,统计后更新相应商户下单量,并标识订单已被处理;最后把所有现有订单处理统计完成。

第二步在下单时维护一个商户下单量字段,

这样最后统计商户订单量前10只需要:

select id,name, order_num from member order by order_num desc limit 10;

即可达到效果。

Mysql 锁

行级锁

表级锁

主键锁

主键锁是为了保护表中具体的一条记录,当对表中的一条记录进行更新(UPDATE)、删除(DELETE)或者插入(INSERT)操作时,MySQL会自动对这条记录加锁

间隙锁

当使用范围当条件进行修改时,会把范围中的符合条件的数据条数进行锁定,还会对一部分可能会修改的数据进行锁定,这部分就是间隙锁。

借鉴文章

个人技术集锦还为您提供以下相关内容希望对您有帮助:

Kafka面试题总结(二)

1. **高性能**:单一的Kafka代理可以处理成千上万的客户端请求,性能远超传统系统如ActiveMQ、RabbitMQ等,且支持批处理操作。2. **可扩展性**:Kafka集群可以轻松扩展,通过增加服务器实现集群的扩展性。3. **容错性**:Kafka使用分区和副本机制,每个分区的数据会复制到多台服务器上,当某个Brok...

最难的25个面试问题(2)

但是无论合适可能的话,在你到面试过程的最后一个阶段之前,少谈论薪水的问题。到那个阶段的时候,你就应该知道,这个公司对你有很大的兴趣,这个时候在谈论薪水待遇的话就会有很大的余地了。24.你长期的目标是什么?回到你寻找工作的计划阶段。不要这样回答“我希望能够得到你广告中的工作”。

【直接收藏】前端 VUE 高阶面试题(二)

1. 数据丢失问题:Vuex状态可以通过vuex-persistedstate插件解决,通过缓存备份state并同步更新,页面刷新时从缓存恢复数据。2. 数据获取:获取Vuex中的数据,可以直接访问state的count属性,如`this.$store.state.count`;getters中的数据则通过`this.$store.getters.getCount`获取。3. Vuex原理:Vuex的核心...

电厂面试题目及参考答案(2)

1. 发电机同步运行的稳定性问题,包括静态稳定、暂态稳定和动态稳定;2. 电力系统无功不足引起的电压稳定性问题;3. 电力系统有功功率不足引起的频率稳定性问题。18. 采用单相重合闸为什么可以提高暂态稳定性?答:采用单相重合闸可以在故障时只切除故障相而不是三相,这样在切除故障相后至重合闸前的一...

招警考试经典面试题及参考答案二

招警考试经典面试题及参考答案(二)例题:假如由你来处理一起交通事故,但你的领导、同事、朋友都纷纷向你施加压力,向你求情,你会怎么办?【试题分析】在工作当中,这样的情景确实经常出现。我们如何在坚持法律公正的基础上妥然处理好与领导、同事、朋友之间的说情风?这就需要我们合情合理合法来回答...

大数据面试题集锦-Hadoop面试题(二)-HDFS

Hadoop的块大小从哪个版本开始是128M?Hadoop1.x都是64M,hadoop2.x开始都是128M。HDFS的存储机制涉及写入和读取数据过程,包括客户端与NameNode和DataNode的交互。secondary namenode工作机制涉及NameNode的启动和Secondary NameNode的定期合并操作。NameNode与SecondaryNameNode的区别在于,NameNode负责管理文件...

硬件工程师面试题答案公布(二)

1. 单片机死机、跑飞的原因涉及多个方面,主要包括:中断管理不当(中断命令未清除)、处理中断向量错误、指针操作导致地址溢出、循环条件未设定引发死循环、堆栈溢出等。2. 虚短和虚断是集成运放中的概念,虚短表示理想状态下运放两个输入端电位相等,如同短路但不真正短路;虚断表示输入电阻无穷大,如同断路...

网络管理员面试题目及答案(2)

网络管理员面试题目及答案(二) 39、堆栈操作中都是对栈顶单元进行的,访问堆栈的地址是由SP指定的。它在操作过程中不需要用户指定。在下推堆栈中,写入堆栈的单元地址是(B)。 A.PC B.(SP)+1 C.SP D.指令寄存器 【解析】堆栈是一个专门的存储区,其存取数据的顺序是先进后出,每次操作都是对栈顶单元进行的...

Adobe面试题及答案(2)

正确答案: 2 问题: 在Adobe Illustrator 9.0中,当使用其它工具时,若要临时切换为放大镜工具,可按住下列哪个键? 1: Shift键 2: Option(Mac OS)/Alt(Windows)键 3: Tab+Shift键 4: 空格键+Command(Mac OS) /空格键+Ctrl(Windows) 正确答案: 4 问题: 在Adobe Illustrator 9.0中,下列关于参考线的描述哪个...

十大经典思维面试题

1. 座右铭能在一定程度上反映应聘者的性格、观念、心态,这是面试官问这个问题的主要原因。2. 不宜说那些医引起不好联想的座右铭。3. 不宜说那些太抽象的座右铭。4. 不宜说太长的座右铭。5. 座右铭最好能反映出自己某种优秀品质。6. 参考答案——“只为成功找方法,不为失败找借口”。问题六:“...

显示全文

猜你还关注