redis持久化2种方式:
1.rdb
什么是持久怀:持久化就是在redis服务器宕机或重启时保证数据不丢失,将数据由内存保存到磁盘的过程。
1.rdb形式---利用快照
快照的条件:在一定时间内发生改变的key的个数超过设定的key的个数则会进行快照
2.快照的原理
分3步:
1)首先redis服务器会利用fork函数复制当前线程的子线程
2)当前线程会继续接受和处理来自客户端发送来的请求,子进程则开始讲内存的数据读取到磁盘中并保存在磁盘中的临时文件里
3)当子进程把内存的数据读取完成后并将数据写入到临时文件后会将临时文件代替原始文件
3.redis服务器数据如何恢复
当redis服务器重启或者启动时会从磁盘中读取rdb快照文件,并将磁盘中的rdb文件中的数据同步到内存中(一般1G的rdb文件需要20-30s)
2.AOF
1.aof是什么:
aof的原理是redis服务器把从客户端发送到服务器的命令都记录下来并保存到磁盘中的aof文件中,当redis服务器重启时会读取磁盘中的aof文件并执行aof文件的命令,
进而把磁盘中的数据同步到内存中
2.aof优化
可以通过BGREWRITEAOF来去除数据中间执行过程,保留最终数据即可
3.aof重写
如当前的aof文件数据大小超过上一次重写的aof文件百分多少时会对aof文件进行重写,如果上一次没有重写则以开机时的为准
4.文件写入时一般先写入到redis的缓存中,每30s同步一次,如果在这30s内发生宕机也会造成数据丢失,所以为了改善这种情况可以把配置文件中的同步方式改为:每秒同步一次
mysql数据库优化:
数据库优化可以从三个大的方面进行:1.查询优化(包括子查询优化链接类型优化表结构优化等)2.数据库存储引擎优化(主要包括MYISAM和INNODB,INSERT UPDATE优化)3.服务器硬件优化
1.查询优化
对于查询优化(一般针对慢查询)可以采用添加索引的方式来增快查询速度
可以使用EXPLAIN来获取数据对查询命令的执行计划,对于type类型,主要包括system(表中只有一行数据,自然查询速度很快)const(每次对查询表时只匹配一行数据,由于只匹配一行数据所以查询数据是很快的)
UNION(链接查询,表示连接查询的第2个或后面的查询语句。)SUBQUERY(子查询中的第1个SELECT语句。),而如果为range查询(范围查询,一次匹配很多行,这是可以添加索引来优化查询)当type为ALL时是最差情况的查询,此时需要进行全表扫描,自然查询效果很差。
添加这些索引需要注意索引生效问题:
1.当我们在使用LIKE关键字进行查询的查询语句中索引匹配的字符串时,%不能放在字符的第一个位置,否则索引不生效,只有%不在第一个位置时索引才会生效
2.当我们在进行连接查询时,匹配的查询字段必须要有数据库表中的第一个字段时索引才会生效
3.查询语句中只有0r关键字时,or关键字的年后必须都要有索引,否则索引不会生效
1.1子查询优化
对于子查询,在数据库执行子查询命令时会先创建一个临时表,当命令执行完成后再将临时表删除,由于需要建立临时表和删除会降低查询效率,我们可以通过使用连接查询(JOIN)来替换子查询,因为连接
查询不需要建立临时表,所以能够提高数据库的查询效率。
2.数据库表结构优化
结构优化主要从个方面进行1.分表2.创建中间表3.添加冗余字段
2.1对含有大量字段的数据表进行分表
由于数据库表中含有很多字段,其中肯定有很多查询频率很低的字段,我们可以将这些使用频率很低的字段单独分出来放到一个表中,这样就实现了使用频率高的字段和使用频率低的字段分离,下次我们在
操作数据库时只对使用频率高的表进行操作就好,这样就能提高数据的操作速率
2.2对于经常需要联合查询的表创建中间表
对于联合查询我们可以通过创建中间表将那些需要通过联合查询的数据插入到中间表,下次再对这些数据进行查询时只在中间表中进行查询即可,这样就优化了数据库的查询效率
2.3适当增加冗余字段
我们在设计数据库表的时候一般都希望表具有较高的规范化,表表之间关系明确,但是如果表过于规范化,那么表与表之间就会造成很多关系,我们查询时需要对很多关系表进行查操作,势必会降低查询效率
,这时我们可以通过添加冗余字段让表与表之间的关系不过与复杂,降低表的规范化程度,从一定程度上可提升和优化对数据库的操作效率。这时我们需要注意一个问题:如果冗余字段的值在一个表中修改了
需要在其它表进行修改,否则就会导致数据不一致问题。
3存储引擎优化(INSERT和UPDATE优化)
数据库MYSQL的存储引擎主要是:MYISAM和INNODB
对存储优化主要分为3个方面:1.索引优化2.唯一性校验3.一次插入数据的条数
3.1 MYISAM:
3.1.1索引
对于非空表,插入记录时,MySQL会根据表的索引对插入的记录建立索引。如果插入大量数据,建立索引会降低插入数据速度。
为了解决这个问题,可以在批量插入数据之前禁用索引,数据插入完成后再开启索引。
在我们进行数据插入前可以先关闭索引,等数据插入完成后在开启索引
关闭索引命令:ALTER TABLEtable_name DISABLE KEYS
开启索引命令:ALTER TABLEtable_name ENABLE KEYS
3.1.2唯一性检验
唯一性校验会降低插入记录的速度,在插入数据前关闭唯一性检验,等数据插入完成后再把唯一性校验打开。
唯一性检验关闭命令:SET UNIQUE_CHECKS=0
唯一性检验开启命令:SETUNIQUE_CHECKS=1
3.1.3一次性插入多条语句
在对数据表进行插入操作时可以一次性插入多条语句,而不是一条一条语句的插入,因为每次插入一条语句数据库就会检查一次,这样会降低插入效率
,对于导入批量数据时可以使用LOAD DATAINFILE来替换INSERT,这样速度要快
3.2 InnoDB
3.2.1禁止索引
对于非空表,数据库会根据插入的数据的记录对数据进行建立索引,如果插入大量数据,建立索引会降低插入数据速度。
为了解决这个问题,可以在批量插入数据之前禁用索引,数据插入完成后再开启索引。
在我们进行数据插入前可以先关闭索引,等数据插入完成后在开启索引
关闭索引命令:ALTER TABLEtable_name DISABLE KEYS
开启索引命令:ALTER TABLEtable_name ENABLE KEYS
3.2.2禁止外键检查
当插入数据时可先禁止对外键的检查,插入完成后在开启,这样能提高插入效率
禁止外检检查命令:SET FORGIN_KEY_CHECKS=0
开启外检检查命令:SET FORGIN_KEY_CHECKS=1
3.2.3禁止自动提交
由于innodb是事务安全的,所以会自动提交事务,可以在插入数据前禁止事务提交,等插入完成后再开启,这样可高效率
禁用:SET autocommit = 0;
开启:SET autocommit = 1;
3.3MYISAM和INNODB的区别
3.3.1myisam
数据库MySQL主要有2个存储引擎myisam和innodb,而myisam是数据库MySQL的默认存贮引擎。
myisam不是事务安全的,不支持外键,但支持全文搜索,myisam表只要存放在3个文件夹下:1.firm文件夹,专门存放myisam表的定义
2.MYD文件夹专门存放myisam表的数据3MYI专门存放myisam表的索引
3.3.2innodb
innodb具有较多特性,首先是事务安全的,具有ACID特性,具有对数据库崩溃的恢复能力,但innodb不支全文检索,支持行级所。
3.3.3主要区别
1.myisam是非事务安全的,innodb是事务安全的
2.myisam支持全文搜索,innodb不支持
3.由于myisam支持全文搜索,索引myisam更适合在大量使用SELECT查询语句中对数据进行存储,而innodb是事务安全的,具有ACID事务支持,所以更加适用于大量进行INSERT和UPDATE情况下使用
4.由于myisam比innodb设计简单,所以在对数据量小的数据进行操作时效率上要优于innodb
5.因为myisam表存贮在文件夹下,所以对数据库数据移动到其它平台时myisam更适合一些
6.由于innodb是事务安全的,所以可以在保证数据不丢失的情况下完成对数据表的由非事务到事务表的切换
7.myisam的粒度是表级,而innodb是行级锁定
4.服务器优化
4.1服务器硬件优化
服务器的硬件性能直接决定着MySQL数据库的性能,硬件的性能瓶颈,直接决定MySQL数据库的运行速度和效率。
需要从以下几个方面考虑:
1、配置较大的内存。足够大的内存,是提高MySQL数据库性能的方法之一。内存的IO比硬盘快的多,可以增加系统的缓冲区容量,使数据在内存停留的时间更长,以减少磁盘的IO。
2、配置高速磁盘,比如SSD。
3、合理分配磁盘IO,把磁盘IO分散到多个设备上,以减少资源的竞争,提高并行操作能力。
4、配置多核处理器,MySQL是多线程的数据库,多处理器可以提高同时执行多个线程的能力。
4.2服务器参数优化
通过优化MySQL的参数可以提高资源利用率,从而达到提高MySQL服务器性能的目的。
MySQL的配置参数都在my.conf或者my.ini文件的[mysqld]组中,常用的参数如下: