做app和网站怎样,如何做html网站,新手要如何让网站被收录,支付宝网站开发流程数据库优化
explain select
重点#xff1a; type类型#xff0c;rows行数#xff0c;extra
SQL的优化
在写on语句时#xff0c;将数据量小的表放左边#xff0c;大表写右边where后面的条件尽可能用索引字段#xff0c;复合索引时#xff0c;最好按复合索引顺序写wh…数据库优化
explain select
重点 type类型rows行数extra
SQL的优化
在写on语句时将数据量小的表放左边大表写右边where后面的条件尽可能用索引字段复合索引时最好按复合索引顺序写where条件where后面有in语句in字段的索引最好放复合索引的后面因为in的字段索引可能会失效模糊查询时尽量用 常量开头不要用%开头用%开头查询索引将失效 select * from table where col like ‘明确%’;尽量不要使用 or否则索引失效尽量不要使用类型转换(显式、隐式),否则索引失效 如果主查询数据量大则使用in如果子查询数据量大则使用exists select * from table_1 where id in(数据量小);查询哪些列就根据哪些列group\order by不然会产生一个临时表写select尽可能的不用 *
实际项目中sql的优化
获取慢sql 并发时候是慢sql单独执行就是慢sql执行sql简单分析 简单分析复杂的sql行数在几十行 先梳理sql的业务 业务的梳理可以拆解sql复杂sql能用代码实现的尽可能用代码来实现
数据库的优化
数据库库层面优化
数据库的配置参数、操作系统参数、磁盘
数据库表层面优化
表的存储引擎建表的时候字段数量及字段类型建索引一般情况下mysql表的索引一张表不超过5个 建视图表 内存表不磁盘上sql优化
数据库拆表
数据库表中数据产品使用一段时间会后某些表的数据量的数据量就可能很大。同时数据库对于产品正常非常重要万一数据库有问题了导致产品无法正常使用数据库还需要备份。
备份一般会备份到其他地方
冷备份指定一个备份规则满足规则的时候做备份。 如凌晨一两点、产品用户使用率最低的时候。热备份几乎实时对数据库的数据变更进行备份。 读写分离、主从同步
读写分离、主从同步
读写分离
主从同步数据库至少是两个以上。多个数据库一般是在不同的机器
读写分离读数据和数据变更实在不同的数据库中。
读、写哪个用主数据库哪个用从数据库-------思考
实操 在一台机器中用docker创建多个数据库 详细搭建教程看这里
docker run -itd --name mysql-1 -p 3366:3306 -e MYSQL_ROOT_PASSWORD123456
mysql:5.7
docker run -itd --name mysql-2 -p 3377:3306 -e MYSQL_ROOT_PASSWORD123456
mysql:5.7
docker run -itd --name mysql-3 -p 3388:3306 -e MYSQL_ROOT_PASSWORD123456
mysql:5.7修改数据的配置文件在配置文件中设置数据库的服务id和日志同步文件格式有多个数据库数据 库的id不相同id值越大将来作为从数据库。
server-id100
log-binmysql-bin
登录准备作为从数据库的数据库添加主数据库的信息添加成功之后从数据库才知道主数据库是哪 个
CHANGE MASTER TO
MASTER_HOST192.168.130.130,
MASTER_PORT3366,
MASTER_USERroot,
MASTER_PASSWORD123456;
START SLAVE;
show slave status; 看执行的结果 Slave_SQL_Running Slave_IO_Running的值为Yes。
Slave_IO_Running意思是二进制文件同步正在运行。Yes就会从主数据库自动同步数据库二进制 文件到从数据。No就不会同步文件
Slave_SQL_Running二进制日志回放正在运行执行sqlYes同步过来的文件就会执行。No 同步过来的文件也不会执行。
数据同步只能是主数据库同步给从数据库不能反过来。
在主数据库做的任何操作都可以同步给从数据库从数据库的数据变动是不能同步给其他从数据库和主数据库的
从数据库改了数据主数据库中新增一条新数据还是可以同步给从数据库的但是如果主数据库改了从数据库相同的数据导致了从数据库冲突冲突之后导致所有数据都不能同步过来。只能解决冲突才能再次同步删除对应的数据并不能解决冲突
所以数据变更是在主数据库获取数据是在从数据库。 从数据库是用来读数据主数据库是用来写数据的。
主从同步
企业中项目70%的性能问题都会与数据库有关。
项目中从数据库中获取数据的使用率远远高于进行数据变更的。
实现数据库读写分离的话那么进行数据变更获取数据就可以从不同的数据库中获取。这样获 取数据的性能会要更高一些。
主从同步至少要有两个以上的数据库。主数据库主要是做数据变更从数据库数据会自动从主数 据库同步过来。这样就可以保障主从数据库的数据一致。读的时候使用从数据库数据数据不会错变更数据使用主数据库这样一旦数据发生变化自动同步给从数据库获取数据是从从数据 库中获取所以从数据库的数据也是变更之后的数据。
从数据库可以是多个。多个从数据库可以配置为集群。项目中jdbc的url地址就配置数据库的集群地址这样项目就可以实现从多个从数据库中获取数据。这样获取数据的性能就提升了。
使用主从同步读写分离在企业项目中是比较常见的。使用之后数据库的性能也是可以得到明显 的提升。
分表分区
-详细看这里
分表
分表拆表垂直拆表水平拆表
拆表拆出来的子表都是真实的物理表表中数据是落在磁盘上的。每个表在磁盘上的文件变小表 的性能就提升了。
垂直拆表根据一定的策略把表的列拆分。 策略如根据sql语句中使用率高低水平拆表根据一定的策略把表的行数量拆分 策略如根据id的尾号
合表主表(是一张虚拟表不再磁盘上)的存储引擎是MRG_MYISAM子表存储引擎必须为MYISAM。 mysql数据库中InnoDB存储引擎不支持合表 分区
数据库表的数据落入磁盘时写入不同的磁盘分区上去。
可以是一张表根据一定的策略把满足策略的数据写入到不同硬盘的分区上。
也可以是数据库中的多张表不同的表写入到不同的硬盘分区上。
写到不同的硬盘每个硬盘都有自己的IO写到不同的硬盘就可以使用不同硬盘的IO性能
分区可以把表数据落到磁盘上的文件变小同时也可以使用不同硬盘IO性能所以数据库表 分区对性能提升是很大的。
但是这种方法在企业中相对主从同步用的少一些。
主要原因
成本做数据表的分区一般要使用RAID磁盘矩阵技术RAID技术、数据库分区的技术、数据恢复技术
总结关系型数据库性能优化
1、数据库是一个软件是安装在操作系统中
优化操作系统优化(硬件、系统参数)、数据库自身参数优化优化主从同步
2、数据库的建库、建表
优化建表的存储引擎、字段类型、字段数量、表索引关联表、建视图优化分表分区
3、数据库的使用
优化sql优化优化读写分离
4、补充现在数据库越来越多出现了分布式数据库。TiDB 非关系型数据库
是相对于关系型数据库而言的关系型数据库表与表之间是有关联关系的。非关系型数据库就是说表与表之间没有明确的关联关系。
关系型数据库表是二维表把数据进行了栅格化。但是非关系型数据库没有对数据进行统一的 标准化的格式化。
关系型数据库统一标准的sql语句非关系型数据库没有统一标准的sql各个不同的非关系型数据 库都有自己的独立的sql语句。
总体的情况是非关系型数据库数据结构虽然没有关系型数据库那么清晰但是性能和数据扩展性 要远远高于关系型数据库。
现在企业项目数据库一般会选择关系型数据库为主数据库非关系型数据库为辅助数据库这种 多数据库组合的方式。
在企业项目中redis作为缓存数据库是最常见的。
因为redis数据库是一个内存数据库它的数据是保存在内存中但是它又有一个自动同步磁盘的机制可以根据设定的配置项目自动间隔一段时间把内存中的数据写入磁盘。redis数据库可以实 现缓存集群。
性能测试学习redis
是内存数据库性能是比较好的至少它的性能比磁盘数据库的性能要高。也会存在性能问题。------→性能测试经历中有见过接口响应时间规律性忽高忽低这种情况很 大概率就是redis性能问题
redis的安装与使用
redis的安装一
redis是6.x版本这个版本要求GCC要大于5.3版本。
GCC是linux系统中编译安装系统软件的必须的库这个库linux中可以直接安装。centos7系统默认直接安装的版本是4.8.5版本。来安装redis6.x版本会报错。
# centos7系统
# 安装gcc
yum install gcc* -y
# 可以使用 gcc -version 来查看gcc的版本
yum -y install centos-release-scl
# 可以使用 yum search devtoolset-* 来查看当前系统可以安装的gcc的版本
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils
scl enable devtoolset-9 bash
echo source /opt/rh/devtoolset-9/enable /etc/profile 安装redis
wget http://download.redis.io/releases/redis-6.0.8.tar.gz
tar -xzvf redis-6.0.8.tar.gz
cd redis-6.0.8
make
在当前这个路径下redis.conf文件就是redis的配置文件
在src路径下会有一些可执行的文件
使用 src/redis-server 启动了redis但是此时redis不是守护进程
daemonize no 在redis默认情况下守护进程为no不是守护进程
redis的安装二
安装的redis是6.x版本gcc需要升级到5.3以上
升级gcc解压redis包
配置项
protected-mode yes 默认是开启包含模式如果开启了用代码调用redis会报错,如果设置为 no就可以不用密码连接redisdaemonize yes 就是守护进程
使用 src/redis-cli 命令可以连接到redis的命令行模式
config get * 可以查看到所有的redis的配置信息
做性能测试要懂得redis的安装、redis的配置redis的使用要了解。
redis的使用
redis有5种常用数据类型以及这些类型是基本使用。string字符串类型 ----→ 值为string set 设置key和valueget获取key的值hash类型 hmset key filed1 value1 flied2 value2 filed3 value3……hget key filednamelist类型 lpush key value1 value2 value3….. 往列表的左边插入数据lrange key start end 从列表的左边开始取值set集合 数据不会重复 sadd key value1 value2smembers sorted set有序集合 zadd 添加数据zrangebyscore 获取数据
redis是内存数据库性能要比磁盘数据库性能要好很多。所以一般情况下不会有性能问题。
redis本身数据类型的操作的信息是非常快的。redis自带了一个性能测试工具这个工具模拟对redis 进行数据操作
redis-benchmark
src/redis-benchmark --help
src/redis-benchmark -n 300000 -q redis的性能问题
主要的原因redis数据需要设置一个有效时长如果不设置这个key对应value就会一直存在redis数据库中redis是一个内存数据库随着使用时间越来越长如果没有给key设置一个失效时长内存总会出现不够用的情况。所以要给key设置一个有效时长。但是如果这个有效时长设置的不合理就可能导致问题。
redis的穿透 redis是一个缓存数据库是用于缓存从磁盘数据库中获取到数据减少从磁盘获取数据的次 数提高获取数据的速度。redis的穿透是获取数据的时候我们key是非法的永远不存在的。获取key的值时从 redis是永远拿不到值就要去后面的磁盘数据库中获取对磁盘数据库造成了很大的压力 设置可能导致磁盘数据库宕机。 解决在代码中对非法的key进行处理就可以了。redis的击穿 持续一段时间内有大量的请求集中在少量的key上面当key失效的时候瞬间请求到了 后端磁盘数据库导致后端磁盘数据库瞬间压力非常大。 解决限量redis的雪崩 redis中key是有一个失效时间在同一个时间点里有大面积的key失效请求这些key的时 候都请求到了后端磁盘数据库。 解决redis设置key的失效时间随机 实战项目
redis_good_cache项目
数据库监控 mysql
数据库的监控、
redis数据库的监控