连表查询注意索引
最左原则
简单的几条linux命令能让你的内存、CPU、disk迅速耗尽
大厂Java八股文面试题整理,它不是最优的解法,但也是最符合当前国内 IT 环境的做法。
打印:
linux 了解
docker了解
nginx了解
java了解
hive, clickhouse, mysql, mongodb, es,postgressql, kafuka 适用于哪些业务场景
mysql的优化
k8s的了解
几种索引
hive, hdfs的区别和联系
数据库的考点
索引,事物,日志,优化,执行原理
高并发:负载均衡,主从数据库,多级缓存,redius缓存
数仓
后端
docker
linux点滴yan
nginx点滴yan
py点滴yan
java菜鸟教程
mysql
mysql的多表查询
mysql-数据类型、约束(主键、唯一键、非空、默认值、无符号、外键)
各数据库对比
Hive和hdfs的关系与区别
k8s
K8s基本概念入门
读写主从
数仓
数据库:
1、hive:用于跑批,大批量,稳定,缺点:无update。用于数仓
2、doris db:已更名starrocks。即时查询 可达千亿级别,文档:什么是 StarRocks @ StarRocks_intro @ StarRocks Docs
3、clickhouse:亿级别 局限性:主表,单表支持能力强,join能力弱
4、mysql:开源免费,十万级别查询
5、elasticsearch:不支持join,有些函数不支持 优点是检索快,如果是查询非字段的类型的,比如一堆文章中靠某些关键字去定位文档。
6、kudu:能支持update、千万级别。数据量大(百亿级别)性能问题明显
7、postgresql:关系型数据库,支持很多分布式集群软件
8、sqlserver:windows运行,常用saas软件,数据在本地,比如医院。。
查询引擎:
1、impala:支持duku、hive,兼容性方面,对duku支持更佳,常用查询kudu
2、presto:支持duku、hive,兼容性方面,对hive支持更佳,常用查询hive
2个都属于查询引擎,其实是一样的产品,不同公司研发(其实也支持mysql,但是没必要再包一层去查询)
nginx => tlb
k8s => tce
loggerid => 日志
周期执行脚本或者命令 =>
k8s 服务器配置很高,几十核,几十G,切分pod资源对应,tce 。
nginx 默认会配置,cpus。
linux 周期 crontab
Kafka 消息中间件
消息中间件,是一个传递消息的通道,消费端可以有多个。
sql
// 创建库
create database RUNOOB
// 删除库
drop database <数据库名>
// 数据库中创建数据表 runoob_tbl
create table IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8
// 删除表 table_name
drop table table_name
// 插入数据
insert into runoob_tbl (runoob_title, runoob_author, submission_date) VALUES ("学习 MySQL", "菜鸟教程", NOW())
// update
update runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3
// delete
delete from runoob_tbl WHERE runoob_id=3
// 查询数据
select * from runoob_tbl
// where
select * from runoob_tbl WHERE runoob_author='菜鸟教程';
// link
select * from runoob_tbl WHERE runoob_author like '%COM'
// union (DISTINCT: 可选,删除结果集中重复的数据)(ALL: 可选,返回所有结果集,包含重复数据)
select country from Websites
union all
select country from apps
order by country;
// order by
select * from runoob_tbl order by submission_date asc
// group by
select name, count(*) from employee_tbl group by name
// 多表联合查询
select sname,sage,cname,grade,s.sid
from student s,course c,score s2
where s.sid = s2.sid AND s2.cid =c.cid AND grade>=80;
// 内连接,左连接,右连接
select * from emp innner join dept on dept.deptno=emp.deptno; -- 内连接实现
select * from emp left join dept on dept.deptno=emp.deptno; 左链接
select * from emp right join dept on dept.deptno=emp.deptno; 右链接
// 分组查询
COUNT(参数):统计查询语句返回的行数
MAX(参数):最大的
MIN(参数):最小的
SUM(参数):求和
AVG(参数):求平均
select count(*),avg(sal) from emp where deptno=20;
// 子查询
// 查询出比金小子年龄大的学生信息
SELECT * FROM STUDENT WHERE sage>(SELECT sage FROM STUDENT WHERE sname='金小子');
// 删除比金小子年龄大的学生信息
DELETE FROM STUDENT WHERE sage>(SELECT sage FROM STUDENT WHERE sname='金小子')
// 字符处理函数
LOWER(参数):将所有字母变成小写
UPPER(参数):将所有字母都变成大写
LENGTH(参数):求字符串的长度
参数:可以是字符类型的列名,或者是普通字符串
REPLACE(X,char1,char2):将字符串X中 char1 替换为 char2
SUBSTR(参数1,参数2,参数3):取子串
参数1:被处理的字符串
参数2:从第几个字符开始取
参数3:取子串的长度
SELECT LOWER('HELlo wOrLd!'),UPPER('HELlo wOrLd!'),LENGTH('HELlo wOrLd!'),
SUBSTR('HELlo wOrLd!','2','6'),REPLACE('HELlo wOrLd!','o','G') FROM DUAL;
SQL语言的分类
日志分类
---接口请求日志 nginx 通过loggerid查询,格式化的数据,放es就行
---审核日志 diting 业务日志 放库里,一般分冷数据放hdfs里,热数据放es中。
---调用链日志 整个调用期间产生的日志,一般放tos(对象存储)那边的hdfs
物理核 逻辑核
CPU个数: 电脑插槽上的CPU个数, 物理cpu数量
CPU核数:一个物理CPU上面能处理数据的芯片组的数量
CPU逻辑核数:一般情况,我们认为一颗cpu可以有多核,加上intel的超线程技术(HT), 可以在逻辑上把一个物理线程模拟出两个线程来使用,使得单个核心用起来像两个核一样,以充分发挥CPU的性能
总核数 = 物理CPU个数 X 每个物理CPU的核数
总逻辑核数= 物理CPU个数 X 每个物理CPU的核数 X 超线程数
--- 如何查看命令
mysql 主键
mysql的主键有哪几种?如何做选择?
(1). 自增序列;
(2). UUID()函数生成的随机值;
(3). 用户注册的唯一性帐号名称,字符串类型,一般长度为:40个字符;
(4). 基于一套机制生成类似自增的值,比如序列生成器;
单一主键,联合主键
mysql 索引
mysql索引设置技巧
深入理解 MySQL 主键和唯一(unique)索引
一文搞懂MySQL索引所有知识点(建议收藏)
Mysql 索引
mysql系列:全网最全索引类型汇总
为什么mysql的索引用b+树
- 顺序查询效率比较高。
- 所有关键字都出现在叶子结点的链表中(稠密索引树的高度低了,io效率高了
回表
- 索引普通索引,找不到索引值就会回表。
- 聚簇索引。
node
后端的性能指标有哪些
吞吐量、PV、QPS、TPS、RPS、I/O 负载概念
PV : 是 Page View 的缩写。来自浏览器的一次 html 内容请求会被看作一个 PV。
QPS:Queries Per Second,意思是每秒查询率,是一台服务器每秒能够响应的查询次数(数据库中的每秒执行查询sql的次数),显然,这个不够全面,不能描述增删改,所以,不建议用qps来作为系统性能指标。
TPS:Transactions Per Second,意思是每秒事务数,具体事务的定义,都是人为的,可以一个接口、多个接口、一个业务流程等等。一个事务是指事务内第一个请求发送到接收到最后一个请求的响应的过程,以此来计算使用的时间和完成的事务个数。
p99: p99为例,它衡量了99%的情况下能达到的最大延迟,99%的请求都低于这个数值,即绝大多数情况下的最差情况。
如何测试qps,p99延时这种
1. tlb自动做了这个。
2. 通过nginx反向代理可以做这个事情,tlb也是基于nginx的代理做的这个事情。
3. 通过埋点,发送打点服务器。
4. 通过埋点,日志监测。
5. 通过jmeter等工具。
6. 听过grafana的工具可以观察到。
-----dance
1. slader埋点检测,报警。
2. loggerid查看具体反应时间
3. 函数内部堆栈信息可以通过火焰图
4. argo监测
机器和进程挂了,如何处理?
(1) 进程挂了:node有一个pm2的进程管理工作,可以通过他设置启动多个进程,当一个进程挂了之后,pm2监测到后,马上重新启动一个新的进程替代旧的进程。
(2) k8s部署服务,当一个pod挂了之后,会自动开启新的pod。
(3) nginx集群中机器挂了:比如用nginx+keepalived实现的集群,keepalived配置备用的nginx分发器,挂了之后自动切新的nginx分发器。
接口502, 挂了,如何报警
1. 前端监测报警-类似-slader报警。
2. 接口监测报警-类似argo报警
3. grafana + 普罗米修斯 或者falcon报警
cpu, 内存,磁盘
1. 物理机:通过给机器安装agent,定时采集数据,发现日志中的cpu,内存磁盘异常就报警。
2. k8s:通过普罗米修斯监测pod cpu, 内存,磁盘,异常报警。
火焰图查询cpu爆满
浏览器的cpu可以通过chrome的内存观察
主从,一般一个主,一个从就够了。大型的应用会有一主多从,主用来写,从用来读。
进程的数目: 计算密集型应用 cpu.length+1, io密集型, cpu.length * 2。
进程间通信的方式有哪些
可观测性的三大支柱:Metrics、Trace、Log
主流metric 、trace、logging框架介绍
cluster fork
cluster fork是新开一个进程,不是线程。
// 族
const cluster = require('cluster');
const cpus = require('os').cpus().length;
const http = require('http');
// cluster帮你提供了fork方法
// 主干
// 在集群的模式下 可以 监听同一个端口号
// 守护进程
if(cluster.isMaster){
console.log('主');// 可以开启子进程,如果fork后会讲此文件重新执行
// 保证项目的健壮性,一个挂了 可以重启
cluster.on('exit',function (worker) {
console.log(worker.process.pid);
cluster.fork();
})
for(let i = 0; i< cpus;i++){
cluster.fork(); // 进程的用法
}
}else{
// 负载均衡
http.createServer((req,res)=>{
if(Math.random()>0.5){
aa();
}
res.end('process'+process.pid)
}).listen(3000);
console.log(process.pid);
}
通信
主进程和子进程可以通过 message 和 send 方法进行通信 webworker