Linux
长时间运行稳定的操作系统,当成服务器(web、db、app)。有C编译环境,有一些软件(Redis、nginx)没有软件包,需要在Linux编译获得软件包。
常用命令
pwd:获取当前路径
cd:跳转到目录
su-u:切换到管理员
ls或ll:列举目录
- 文件操作命令
- 文件
- 查看 Tail
- 删除 rm-rf
- vi
- 文件夹
- 创建mkdir
- 删除rm-rf
- 文件
怎么连接远程Linux服务器
需依赖于Linux服务器安装SSH服务器、SFTP服务器,SSH服务的端口为22,SFTP服务器端口为25,使用SSH客户端连接,Xshell、Putty
使用SFTP客户端,上传和下载文件(上传安装包,修改配置文件上传)Winscp、XFTP
putty+winscp
xshell+xFTP =>xmanager
云主机
云主机就是云服务运营商(阿里、华为、新浪、西部数码等)提供远程服务器功能付费租用对应服务器。
数据库优化
- 定位:查找、定位慢查询、并优化
- 创建索引:在索引中查询,直接找到对应记录
- 分表:当表中数据比较多或默写字段的值比较多但很少使用时,采用水平分表和垂直分表
- 读写分离:一台服务器不满足需求是,用读写分离的方式进行集群。
- 主从同步:数据库将数据持久化到磁盘上,每个数据库服务器的数据一致。修改操作在主数据库写,其他数据库同步数据。使用负载均衡实现写操作往主数据库取,读往从数据库取。
- 缓存:使用redis来进行缓存
查找、定位慢查询
在项目自验后转测试,启动数据库开启慢查询,并且把执行慢的调用语句写到日志中,在运行一定的时间后,通过查看日志,找到相应的慢查询语句。
使用explain慢查询语句,详细分析语句的问题
show variables like ‘log_slow_queries’;
开启 set global log_slow_queries = on;
数据库优化遵循范式
首先符合1NF,才能满足2NF,才能满足3NF
1NF:表中列具有原子性,不能再分解
2NF:表中记录唯一,主键
3NF:外键,表中不要有冗余数据
反三范式
数据库优化创建索引
- 普通索引:允许重复值出现
- 唯一索引:唯一,不能有重复值
- 主键索引:唯一且不为null,根据主键创建索引
- 全文索引:根据文本域(varchar、char、text)进行索引—>sphinx
explain select * from articles where match(title,body) against(‘database’);- 索引占用磁盘空间、对DML(数据操纵语言SELECT、UPDATE、INSERT、DELETE)操作变慢
- 使用场景:
1.在where条件经常使用
2.字段内容不是唯一的几个值
3.字段内容不频繁变化 - 具体技巧
- 创建多列索引(复合索引),不使用第一部分就不会使用索引。
- 用like查询时,前面使用通配符%不会用索引,即关键字不能使用%或_,反之亦然。只能‘aaa%’\G
- 条件有or,有条件中没有使用索引,其他条件也不能用。要求每个字段单独使用时能索引
- 列类型是字符串时,在条件中用引号引用起来
- 使用全表扫描比使用索引快,不使用索引
数据库优化之分表
水平分表和垂直分表
表数据达到百万级,查询效率低,容易造成表锁。(垂直分表)表中字段的值多(长文本、二进制),而且只在少数情况下查询,可将字段单独放在一个表中,用外键连接。
- 水平分表
- 按时间分表:数据时效性强
- 按区间范围分表:自增ID需求
- Hash分表:通过原始ID或名称按hash算法计算出数据存储表的表名
数据库优化选择合适的存储引擎
myisam/innerDB/memory
MYISAM:表对事务要求不高,以查询和添加为主,
INNERDB:对事务要求高,保存的都是重要数据,
MEMORY:数据变化频繁,不需要入库,有繁忙的查询和修改,速度快
MyISAM和InnerDB的区别!!!
- 事务安全:MyISAM不支持事务,innerDB支持
- 添加和查询速度:myisam不用考虑同步锁,查询和添加速度快
- 全文索引:myisam支持
- 锁机制:myisam支持表锁,innerDB支持行锁
- 外键:myisam不支持外键,InnerDB支持外键
数据库优化之缓存
在持久层(dao层)与数据库(db)之间添加一个缓存层,减少数据库服务器压力,减少访问时间。
Hibernate的二级缓存(SessionFactory),但是他不能完成分布式缓存,中央缓存用redis、memcache
数据库优化之语句优化
- DDL(Data definition Language)优化:
- 导入数据时,禁用索引
- 关闭唯一校验 set unique_checks = 0//关闭
- 修改事务提交方式 set autocommit=0,将多次提交变为一次
- DML优化(data manipulation操纵 language):将多次提交变为一次
- DQL优化:
- order by—多用索引排序、普通结果排序Filesort
- group by:使用order by null取消默认排序
- or优化,or两边都用索引性能好
连接阿里云服务器创建的数据库
实现批量插入几百万条数据
- 原理:变多次提交为一次,使用批量操作。
redis
key-value的nosql数据库,先存到内存中,根据策略持久化到磁盘上,断电也不会丢失数据,支持的数据类型多。
- 作用:做缓存数据库和web集群时当中央缓存存放session
- 使用场景:经常查询、很少修改的数据存放到内存中,减少访问时间、减轻压力。
- redis中计数器时原子性的内存操作,可解决库存溢出问题
- session缓存服务器:web集群时作为session的缓存服务器
- 缓存队列
redis和memcache
mysql | redis | memcache | |
---|---|---|---|
类型 | 关系型 | 非关系型 | 非关系型 |
存储位置 | 磁盘 | 磁盘和内存 | 内存 |
存储过期 | 不支持 | 支持 | 支持 |
读取性能 | 低 | 非常高 | 非常高 |
redis对象保存方式
JSON字符串:需要将对象转换为JSON字符串,当做字符串处理,直接使用get、set使用。设置和获取简单,但没有提供专门的方法将对象转换为JSON。(JSONlib)字段不多用本方式
字节流:需要做序列化为字节保存,数据量大采用本方式
redis的淘汰机制
设置最大使用内存:server.maxmemory
内存大小有限,需要保存有效数据
- noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。
- allkeys-lru:在主键空间中,优先移除最近未使用的key。
- volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。最近最少
- allkeys-random:在主键空间中,随机移除某个key。
- volatile-random:在设置了过期时间的键空间中,随机移除某个key。
- volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
Java访问Redis
- 使用jedis java客户端访问redis服务器
- 使用spring集群时,可使用spring data访问redis,二次封装
redis集群
当一台数据库服务器无法满足需求时,用redis集群处理,采用读取分离。