面试题整理 2

总结了本次面试遇到的值得整理记录的面试题。

目录

变量赋值判断

变量+=判断

Foreach使用

Mysql优化策略

合理的索引设计

查询优化

数据表结构设计

配置优化

合理使用事务

定期维护数据库

使用缓存

监控与性能分析

Redis主从复制

介绍

配置

示例

Redis 数据类型及应用

string

常用命令

应用场景

hash

常用命令

应用场景

list

常用命令

应用场景

set

常用命令

应用场景

zset

常用命令

应用场景

Mysql 事务级别

1.READ UNCOMMITTED

2.READ COMMITTED

3.REPEATABLE READ

4.SERIALIZABLE

大数据量统计

Mysql 锁

行级锁

表级锁

主键锁

间隙锁

借鉴文章


变量赋值判断

$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 6379slave-serve-stale-data yesslave-read-only yes

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

Redis 数据类型及应用

string

常用命令

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

获取字符串长度

往字符串append内容

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

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

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

应用场景

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

也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY命令让这些变得很容易,通过原子递增保持计数。

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会自动对这条记录加锁

间隙锁

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

借鉴文章

MySQL常见优化策略_mysql优化策略-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SOLID原则-单一职责原则

转载请注明出处:https://blog.csdn.net/dmk877/article/details/143447010 作为一名资深程序员越来越感觉到基础知识的重要性,比如设计原则、设计模式、算法等,这些知识的长期积累会让你突破瓶颈实现质的飞跃。鉴于此我决定写一系列与此相关的博客&…

「C/C++」C/C++ 之 指针详解

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CSS--导航栏案例

利用CSS制作北大官网导航栏 详细代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}#menu{background-color: darkred;width: 100%;height: 50px…

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割!

【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 【语义分割|代码解析】CMTFNet-2: CNN and Multiscale Transformer Fusion Network 用于遥感图像分割&#xff01; 文章目录 【语义分割|代码解析】CMTFNet-2: …

基于 Python 的 Django 框架开发的电影推荐系统

项目简介&#xff1a;本项目是基于 Python 的 Django 框架开发的电影推荐系统&#xff0c;主要功能包括&#xff1a; 电影信息爬取&#xff1a;获取并更新电影数据。数据展示&#xff1a;提供电影数据的列表展示。推荐系统&#xff1a;基于协同过滤算法实现个性化推荐。用户系…

Spring Boot 集成 RocketMQ

在现代分布式系统中&#xff0c;消息队列扮演着至关重要的角色。它能够实现系统间的异步通信、解耦组件以及提高系统的可扩展性和可靠性。RocketMQ 作为一款高性能、分布式的消息中间件&#xff0c;被广泛应用于各种大规模系统中。而 Spring Boot 作为一种流行的 Java 开发框架…

Window系统性能调优

1. 系统设置优化 性能选项调整&#xff1a; 右键点击“此电脑” > “属性” > “高级系统设置” > “性能” > “设置”。在“视觉效果”选项卡中&#xff0c;选择“调整为最佳性能”以禁用不必要的动画和效果&#xff0c;或选择自定义禁用特定效果。 电源选项&…

高并发场景下的性能测试方法!

在现代互联网应用中&#xff0c;高并发场景下的性能测试显得尤为重要。无论是电商平台的秒杀活动&#xff0c;还是社交应用的突发流量&#xff0c;都需要确保系统能够在高并发情况下稳定运行。本文将详细介绍高并发场景下的性能测试方法&#xff0c;并提供具体的方案和实战演练…

苹果开发 IOS 证书生成步骤

前提条件 你手上有一台 Macbook你的苹果账号已被添加到开发人员中 证书创建步骤 打开 XCode 直接生成 p12证书生成后&#xff0c;就可在苹果开发者管理界面中看到你的证书记录登录苹果开发中心&#xff0c;创建 profiles 文件&#xff0c;并下载以上步骤即可&#xff0c;就这…

超萌!HTMLCSS:超萌卡通熊猫头

效果演示 创建了一个卡通风格的熊猫头 HTML <div class"box"><div class"head"><div class"head-copy"></div><div class"ears-left"></div><div class"ears-right"></di…

【Spark中创建RDD的两种方式】Spark中如何获取sc对象、以及创建RDD的两种方式

文章目录 一、Spark如何获取sc对象1、windons 本地模式获取sc对象2、linux 集群模式获取sc对象 二、创建RDD的两种方式1、并行化一个已存在的集合2、读取外部共享存储系统 一、Spark如何获取sc对象 不论是本地测试还是集群模式&#xff0c;都需要指定 JAVA_HOME 和 HADOOP_HOM…

RHCE第四天笔记

1.web服务器简介 &#xff08;1&#xff09;什么是www www是world wide web的缩写&#xff0c;也就是全球信息广播的意思。通常说的上网就是使用www来查询用户 所需要的信息。www可以结合文字、图形、影像以及声音等多媒体&#xff0c;并通过可以让鼠标单击超链接的方 式将信息…

springboot高校运动会管理系统-计算机毕业设计源码33814

摘要 本文旨在介绍基于Spring Boot框架和HTML技术开发的高校运动会管理系统。通过该系统&#xff0c;学校能够更高效地组织和管理校园内的各项体育赛事&#xff0c;提升运动会的组织效率和参与体验。系统整合了Spring Boot的强大功能和HTML的灵活性&#xff0c;为高校运动会管理…

Linux特种文件系统--tmpfs文件系统

tmpfs类似于RamDisk&#xff08;只能使用物理内存&#xff09;&#xff0c;使用虚拟内存&#xff08;简称VM&#xff09;子系统的页面存储文件。tmpfs完全依赖VM&#xff0c;遵循子系统的整体调度策略。说白了tmpfs跟普通进程差不多&#xff0c;使用的都是某种形式的虚拟内存&a…

森利威尔SL2516D 耐压60V内置5V功率MOS 支持PWM LED恒流驱动器芯片

一、基本特性 型号&#xff1a;SL2516D封装&#xff1a;ESOP8工作频率&#xff1a;140kHz驱动MOS管&#xff1a;内置 二、电气特性 输入电压范围&#xff1a;8V~100V&#xff08;注意&#xff0c;虽然问题中提到耐压60V&#xff0c;但根据官方信息&#xff0c;其实际耐压范围…

力扣287.寻找重复数

1.哈希表法 #include<stdio.h> #include<stdlib.h> int func(int *arr,int len) {int *hash(int *)malloc(sizeof(int)*len);for(int i0;i<len;i){if(hash[arr[i]]1){free(hash);return arr[i];}hash[arr[i]]1;}free(hash);return -1; }int main() {int arr[5]{…

服务器数据恢复—DELL EqualLogic PS6100系列存储简介及如何收集故障信息?

DELL EqualLogic PS6100系列存储采用虚拟ISCSI SAN阵列&#xff0c;支持VMware、Solaris、Linux、Mac、HP-UX、AIX操作系统&#xff0c;提供全套企业级数据保护和管理功能&#xff0c;具有可扩展性和容错功能。DELL EqualLogic PS6100系列存储介绍&#xff1a; 1、上层应用基础…

点云学习笔记3——读取点云文件、进行统计滤波/直通滤波后可视化

一、统计滤波 #include <iostream> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h> #include <pcl/common/common_headers.h> #include <pcl/visualiza…

【笔面试常见题:三门问题】用条件概率、全概率和贝叶斯推导

1. 问题介绍 三门问题&#xff0c;又叫蒙提霍尔问题&#xff08;Monty Hall problem&#xff09;&#xff0c;以下是蒙提霍尔问题的一个著名的叙述&#xff0c;来自Craig F. Whitaker于1990年寄给《展示杂志》&#xff08;Parade Magazine&#xff09;玛丽莲沃斯莎凡特&#x…

C++ | Leetcode C++题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution { public:int countArrangement(int n) {vector<int> f(1 << n);f[0] 1;for (int mask 1; mask < (1 << n); mask) {int num __builtin_popcount(mask);for (int i 0; i < n; i) {if (mask &am…