Loading

挑战三天刷完-MySQL数据库优化(第三天)

SQL优化

大批量插入数据

1) 主键顺序插入

即插入数据是有序的,按照主键排序的。

因为InnoDB类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数 据的效率。如果InnoDB表没有主键,那么系统会自动默认创建一个内部列作为主键,所以如果可以给表创建一个 主键,将可以利用这点,来提高导入数据的效率。

2) 关闭唯一性校验

在导入数据前执行 SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢 复唯一性校验,可以提高导入的效率。

3) 手动提交事务

关闭自动提交,在数据导入结束后再开启,可以加快速度。

优化insert语句

如果需要同时对一张表插入很多行数据时,应该尽量使用多个值表的insert语句,这种方式将大大的缩减客户 端与数据库之间的连接、关闭等消耗。使得效率比分开执行的单个insert语句快。(即多条insert合并为一条)

在事务中进行数据插入。(手动提交事务)

数据有序插入。

优化order by语句

两种排序方式

1). 第一种是通过对返回数据进行排序,也就是通常说的 filesort 排序,所有不是通过索引直接返回排序结果的排序 都叫 FileSort 排序。

2). 第二种通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高。(select 索引字段)

多字段排序时要么全部升序,要么全部降序。字段顺序要和索引字段顺序一致。

Filesort 的优化

对于Filesort , MySQL 有两种排序算法:

1) 两次扫描算法 :MySQL4.1 之前,使用该方式排序。首先根据条件取出排序字段和行指针信息,然后在排序区 sort buffer 中排序,如果sort buffer不够,则在临时表 temporary table 中存储排序结果。完成排序之后,再根据 行指针回表读取记录,该操作可能会导致大量随机I/O操作。

2)一次扫描算法:一次性取出满足条件的所有字段,然后在排序区 sort buffer 中排序后直接输出结果集。排序时 内存开销较大,但是排序效率比两次扫描算法要高。

MySQL 通过比较系统变量 max_length_for_sort_data 的大小和Query语句取出的字段总大小,来判定是否那种排 序算法,如果max_length_for_sort_data 更大,那么使用第二种优化之后的算法;否则使用第一种。

可以适当提高 sort_buffer_size (第一种)和 max_length_for_sort_data (第二种)系统变量,来增大排序区的大小,提高排序的效率。

优化group by 语句

由于GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作。

要想使用group by可以执行order by null禁止排序。

1)使用order by null禁止排序。

2)创建索引

优化嵌套查询

用多表连接查询来替换子查询。

 

 

优化OR条件

 对于包含OR的查询子句,如果要利用索引,则OR之间的每个条件列都必须用到索引 , 而且不能使用到复合索引; 如果没有索引,则应该考虑增加索引。

1)使用 union 替换 or

 

优化分页查询

 使用limit是先排序,再去最后的。

1)在索引上完成排序分页操作,最后根据主键关联回原表查询所需要的其他列内容。

用索引排序分页之后,用where关联查询可以提高速度

 

 

 2)该方案适用于主键自增的表,可以把Limit 查询转换成某个位置的查询 。

必须是主键自增的列,且不能出现断层。

使用SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

USE INDEX

在查询语句中表名的后面,添加 use index 来提供希望MySQL去参考的索引列表,就可以让MySQL不再考虑其他可用的索引。

IGNORE INDEX

如果用户只是单纯的想让MySQL忽略一个或者多个索引,则可以使用 ignore index 作为 hint 。

FORCE INDEX

为强制MySQL使用一个特定的索引,可在查询中使用 force index 作为hint 。

(如全表比索引块,走的是全表。使用force可以强制走索引,而使用use不会走索引)

应用优化

在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力。(前台应用优化)

使用连接池

我们频繁的创建关闭连接,是比较耗费资源的,我们有 必要建立 数据库连接池,以提高访问的性能。

减少对MySQL的访问

1)避免对数据进行重复检索(一次查询能查到的,不能分为两次)

2)增加cache层

负载均衡

1)利用MySQL复制分流查询

2)采用分布式数据库架构

Mysql中查询缓存优化

开启Mysql的查询缓存,当执行完全相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改, 之前的缓存会失效,修改比较频繁的表不适合做查询缓存。(修改频繁不适合查询缓存)

操作流程

 

查询缓存配置

 

 SHOW VARIABLES LIKE 'have_query_cache';查看MySQL数据库是否支持查询缓存。

SHOW VARIABLES LIKE 'query_cache_type';查看是否开启了缓存

SHOW VARIABLES LIKE 'query_cache_size';查看占用缓存大小

SHOW STATUS LIKE 'Qcache%';查询缓存的状态变量

 

 

 开启查询缓存

vi /usr/my.cnf,我的是在/etc/my.cnf。

文件最后添加query_cache_type=1;

 

 

 

查询缓存SELECT选项

 

添加select后面

 

 查询缓存失效的情况

1) SQL 语句不一致的情况, 要想命中查询缓存,查询的SQL语句必须一致。(比如大小写,会被认为是不一致)

2) 当查询语句中有一些不确定的时,则不会缓存。如 : now() , current_date() , curdate() , curtime() , rand() , uuid() , user() , database() 。

3) 不使用任何表查询语句。

4) 查询 mysql, information_schema或 performance_schema 数据库中的表时,不会走查询缓存。

5) 在存储的函数,触发器或事件的主体内执行的查询。

6) 如果表更改,则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。这包括使用 MERGE 映射到 已更改表的表的查询。一个表可以被许多类型的语句,如被改变 INSERT, UPDATE, DELETE, TRUNCATE TABLE, ALTER TABLE, DROP TABLE,或 DROP DATABASE 。(表更改则失效)

Mysql内存管理及优化

内存优化原则

1) 将尽量多的内存分配给MySQL做缓存,但要给操作系统和其他程序预留足够内存。

2) MyISAM 存储引擎的数据文件读取依赖于操作系统自身的IO缓存,因此,如果有MyISAM表,就要预留更多的 内存给操作系统做IO缓存。

3) 排序区、连接区等缓存是分配给每个数据库会话(session)专用的,其默认值的设置要根据最大连接数合理 分配,如果设置太大,不但浪费资源,而且在并发连接较高时会导致物理内存耗尽。(根据连接数分配)

MyISAM 内存优化(并发量大才感受得到)

myisam存储引擎使用 key_buffer 缓存索引块,加速myisam索引的读写速度。对于myisam表的数据块,mysql没 有特别的缓存机制,完全依赖于操作系统的IO缓存。

 

InnoDB 内存优化

 

 Mysql并发参数调整

从实现上来说,MySQL Server 是多线程结构,包括后台线程和客户服务线程。多线程可以有效利用服务器资源, 提高数据库的并发性能。在Mysql中,控制并发连接和线程的主要参数包括 max_connections、back_log、 thread_cache_size、table_open_cahce。

max_connections

采用max_connections 控制允许连接到MySQL数据库的最大数量,默认值是 151。如果状态变量 connection_errors_max_connections 不为零,并且一直增长,则说明不断有连接请求因数据库连接数已达到允 许最大值而失败,这是可以考虑增大max_connections 的值。 Mysql 最大可支持的连接数,取决于很多因素,包括给定操作系统平台的线程库的质量、内存大小、每个连接的负 荷、CPU的处理速度,期望的响应时间等。在Linux 平台下,性能好的服务器,支持 500-1000 个连接不是难事, 需要根据服务器性能进行评估设定。

back_log

 back_log 参数控制MySQL监听TCP端口时设置的积压请求栈大小。如果MySql的连接数达到max_connections时, 新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过 back_log,将不被授予连接资源,将会报错。5.6.6 版本之前默认值为 50 , 之后的版本默认为 50 + (max_connections / 5), 但最大不超过900。 如果需要数据库在较短的时间内处理大量连接请求, 可以考虑适当增大back_log 的值。

table_open_cache

该参数用来控制所有SQL语句执行线程可打开表缓存的数量, 而在执行SQL语句时,每一个SQL执行线程至少要打 开 1 个表缓存。该参数的值应该根据设置的最大连接数 max_connections 以及每个连接执行关联查询中涉及的表 的最大数量来设定 : max_connections x N ;

thread_cache_size

为了加快连接数据库的速度,MySQL 会缓存一定数量的客户服务线程以备重用,通过参数 thread_cache_size 可 控制 MySQL 缓存客户服务线程的数量。

innodb_lock_wait_timeout

该参数是用来设置InnoDB 事务等待行锁的时间,默认值是50ms , 可以根据需要进行动态设置。对于需要快速反 馈的业务系统来说,可以将行锁的等待时间调小,以避免事务长时间挂起; 对于后台运行的批量处理程序来说, 可以将行锁的等待时间调大,以避免发生大的回滚操作。

Mysql锁问题

锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。

如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的 一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

锁分类

从对数据操作的粒度分 :

1) 表锁:操作时,会锁定整个表。

2) 行锁:操作时,会锁定当前操作行。

从对数据操作的类型分:

1) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。 

2) 写锁(排它锁):当前操作没有完成之前,它会阻断其他写锁和读锁

Mysql锁

 

MySQL这3种锁的特性可大致归纳如下 :

 

仅从锁的角度来说:

表级 锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web 应用;

而行级锁则更适合于有大量按索引 条件并发更新少量不同数据,同时又有并查询的应用,如一些在线事务处理(OLTP)系统。

 MyISAM 表锁

 MyISAM 存储引擎只支持表锁

如何加表锁

 

不需要自己加,系统会加,也会自动释放。也可以显示的加。

显示加表锁语法:

读锁

显示加锁要释放锁,不然当前线程查不了其他表的数据,而且其他线程对加了读锁的表进行不了写操作

写锁

加了写锁,当前写锁的线程可以查和改,但是其他线程不能查或改。

结论

 

读锁会阻塞写,不会阻塞读。而写锁,既会阻塞读,又会阻塞写。

查看锁的争用情况

show open tables;

show status like 'Table_locks%';

 

 InnoDB 行锁

行锁介绍

行锁特点 :偏向InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度 也最高。

InnoDB 与 MyISAM 的最大不同有两点:一是支持事务;二是 采用了行级锁。

背景知识

事务及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元。

事务具有以下4个特性,简称为事务ACID属性

 

 并发事务处理带来的问题

 

 

 

 

幻读重点是新增或删除:同样的条件, 第1次和第2次读出来的记录数不一样。

 

 

 

 事务隔离级别(为了解决并发事务带来的问题)

 

通过show variables like 'tx_isolation';查看数据库的隔离级别。

InnoDB 的行锁模式

lock table table_name read是MyISAM表显式加深,而上面的是InnoDB

行锁基本演示

演示时首先要关闭事务自动提交,即set autocommit=0;

对于不同行,不同线程更新不同行时,不会出现阻塞情况。

行锁升级为表锁

如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际效果跟表锁一样。(索引失效也相当于不通过索引条件)

查看当前表的索引 : show index from test_innodb_lock ;

间隙锁危害

当我们用范围条件,而不是使用相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据进 行加锁; 对于键值在条件范围内但并不存在的记录,叫做 "间隙(GAP)" , InnoDB也会对这个 "间隙" 加锁,这 种锁机制就是所谓的 间隙锁(Next-Key锁) 。

比如ID<10,而只有1,2,3,9。间隙锁会对4,5,6,7,8加锁。

当要插入新数据id为4,5,6,7,8时,插入不了,得提交完事务解锁之后才能插入数据。

InnoDB 行锁争用情况

show status like 'innodb_row_lock%';查看InnoDB行锁

<Innodb_row_lock_current_waits: 当前正在等待锁定的数量

Innodb_row_lock_time: 从系统启动到现在锁定总时间长度

Innodb_row_lock_time_avg:每次等待所花平均时长

Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间

Innodb_row_lock_waits: 系统启动后到现在总共等待的次数>

总结

 

 

 常用的SQL技巧

SQL执行顺序

编写顺序:

 

执行顺序:

 

 

正则表达式使用

 

 

 

 MySQL 常用函数

以下介绍4种:数字函数、字符串函数、日期函数、聚合函数

数字函数

 

 

 字符串函数

 

 

 

 日期函数

 

 

 聚合函数

 

 

 

 MySql中常用工具

mysql

连接指令:

-u, --user=name 指定用户名

-p, --password[=name] 指定密码

-h, --host=name 指定服务器IP或域名

-P, --port=# 指定连接端口

 

 

 

-e, --execute=name 执行SQL语句并退出

此选项可以在Mysql客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。

mysql -uroot -p2143 db01 -e "select * from tb_book";(即不连接数据库服务,直接在命令中输入数据库账号密码,然后执行)

mysqladmin

mysqladmin 是一个执行管理操作的客户端程序。可以用它来检查服务器的配置和当前状态、创建并删除数据库等。 

可以通过 : mysqladmin --help 指令查看帮助文档

 

不登陆mysql服务来操作数据库。

 

mysqlbinlog(日志)

由于服务器生成的二进制日志文件以二进制格式保存,所以如果想要检查这些文本的文本格式,就会使用到 mysqlbinlog 日志管理工具。

语法:

 

mysqldump(备份)

mysqldump 客户端工具用来备份数据库或在不同数据库之间进行数据迁移。备份内容包含创建表,及插入表的 SQL语句。

 

 

 

 

test是数据库、city是表

 

mysqlimport(导入txt文件)/source(导入SQL文件)

 

 mysqlimport 是客户端数据导入工具,用来导入mysqldump 加 -T 参数后导出的文本文件。

语法:

mysqlimport [options] db_name textfile1 [textfile2...]

示例:

mysqlimport -uroot -p2143 test /tmp/city.txt

如果需要导入sql文件,可以使用mysql中的source 指令 :

source /root/tb_book.sql

mysqlshow

mysqlshow 客户端对象查找工具,用来很快地查找存在哪些数据库、数据库中的表、表中的列或者索引。

语法:

 

 

 参数:

实例:

 Mysql 日志

在 MySQL 中,有 4 种不同的日志,分别是错误日志、二进制日志 (BINLOG 日志)、查询日志和慢查询日志,这些日志记录着数据库在不同方面的踪迹。

错误日志

错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何 严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。

该日志是默认开启的 , 默认存放目录为 mysql 的数据目录(var/lib/mysql), 默认的日志文件名为 hostname.err(hostname是主机名)。

指令:

show variables like 'log_error%';查看日志位置

tail -f /var/lib/mysql/xaxh-server.err  查看日志内容

二进制日志

不包含select语句。

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。

此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现 的。

二进制日志,默认情况下是没有开启的,需要到MySQL的配置文件中开启,并配置MySQL日志的格式。

配置文件位置 : /usr/my.cnf(我的在/etc/my.cnf)

日志存放位置 : 配置时,给定了文件名但是没有指定路径,日志默认写入Mysql的数据目录。 

 

 

 

 日志格式

 

 

 日志读取

语法:

mysqlbinlog log-file;查看二进制文件的内容(能查看二进制文件,且以不是二进制的格式线程出来)。

查看STATEMENT格式日志

二进制文件在/var/lib/mysql

mysqlbin.index : 该文件是日志索引文件 , 记录日志的文件名;

mysqlbing.000001 :日志文件

mysqlbinlog mysqlbing.000001;可以读取日志

查看ROW格式日志

配置:

 

 

 如果日志格式是 ROW , 直接查看数据 , 是查看不懂的 ; 可以在mysqlbinlog 后面加上参数 -vv

删除日志

对于比较繁忙的系统,由于每天生成日志量大 ,这些日志如果长时间不清楚,将会占用大量的磁盘空间。下面我们 将会讲解几种删除日志的常见方法 :

方式一(删除全部)

通过 Reset Master 指令删除全部 binlog 日志,删除之后,日志编号,将从 xxxx.000001重新开始。

查询之前 ,先查询下日志文件 :

执行删除日志指令:Reset Master

方式二(删除指定)

执行指令 purge master logs to 'mysqlbin.******' ,该命令将删除 ****** 编号之前的所有日志。

方式三(删除指定时间之前)

执行指令 purge master logs before 'yyyy-mm-dd hh24:mi:ss' ,该命令将删除日志为 "yyyy-mm-dd hh24:mi:ss" 之前产生的所有日志 。

方式四 (设置过期时间,时间一到自动删除)

Reset Master 设置参数 --expire_logs_days=# ,此参数的含义是设置日志的过期天数, 过了指定的天数后日志将会被自动删 除,这样将有利于减少DBA 管理日志的工作量。

查询日志

查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。

默认情况下, 查询日志是未开启的。如果需要开启查询日志,可以设置以下配置 :

配置 :

 慢查询日志

 慢查询日志记录了所有执行时间超过参数 long_query_time 设置值

并且扫描记录数不小于 min_examined_row_limit 的所有的SQL语句的日志。

long_query_time 默认为 10 秒,最小为 0, 精度可以到微秒。

 配置:

 

直接通过cat 指令查询该日志文件 :cat  slow_query.log;

如果慢查询日志内容很多, 直接查看文件,比较麻烦, 这个时候可以借助于mysql自带的 mysqldumpslow 工 具, 来对慢查询日志进行分类汇总。

mysqldumpslow slow_query.log;

Mysql复制

复制是指将主数据库的DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行 (也叫重做),从而使得从库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

复制原理:

 

 

 从上层来看,复制分成三步:

Master 主库在事务提交时,会把数据变更作为时间 Events 记录在二进制日志文件 Binlog 中。

主库推送二进制日志文件 Binlog 中的日志事件到从库的中继日志 Relay Log 。

slave重做中继日志中的事件,将改变反映它自己的数据。

复制优势

MySQL 复制的有点主要包含以下三个方面:

1)主库出现问题,可以快速切换到从库提供服务。

2)可以在从库上执行查询操作,从主库中更新,实现读写分离,降低主库的访问压力。

3)可以在从库中执行备份,以避免备份期间影响主库的服务。

搭建步骤

master(主机)

1)配置:

 

2)执行完毕之后,需要重启Mysql: 

service mysql restart ;

3) 创建同步数据的账户,并且进行授权操作(括号里的内容是新加用来解释的,需要删除):

grant replication slave on *.*(所有的数据库) to 'itcast(用户名)'@'192.168.192.131(ip地址)' identified by 'itcast(密码)';

flush privileges;

4) 查看master状态:

show master status;

字段含义: 

File : 从哪个日志文件开始推送日志文件

Position : 从哪个位置开始推送日志

Binlog_Ignore_DB : 指定不需要同步的数据库

slave(复制的)

1) 在 slave 端配置文件中,配置如下内容:

 

 

 

 

2) 执行完毕之后,需要重启Mysql:

service mysql restart;

3) 执行如下指令 :

 

由show master status的信息填,该步骤决定了是否成功。

 

 4) 开启同步操作

start slave;

show slave status;

5) 停止同步操作

stop slave;

综合案例

需求分析

在业务系统中,需要记录当前业务系统的访问日志,该访问日志包含:操作人,操作时间,访问类,访问方法,请 求参数,请求结果,请求结果类型,请求时长 等信息。记录详细的系统访问日志,主要便于对系统中的用户请求进 行追踪,并且在系统 的管理后台可以查看到用户的访问记录。

记录系统中的日志信息,可以通过Spring 框架的AOP来实现。具体的请求处理流程,如下:

 

记录日志和查询日志。

pom文件

 

 

web.xml

 

 

 

db.properties

数据库配置文件

applicationContext.xml

 

springmvc.xml

通过AOP记录操作日志

 1)自定义注解

通过自定义注解,来标示方法需不需要进行记录日志,如果该方法在访问时需要记录日志,则在该方法上标示该注解既可

 

 

 

2)定义通知类

3)方法上加注解

在需要记录日志的方法上加上注解@OperateLog。

 

 

 

 日志查询后端代码实现

spring编写CRUD

日志查询前端代码实现

 vue编写前端页面

分析性能问题

系统中用户访问日志的数据量,随着时间的推移,这张表的数据量会越来越大,因此我们需要根据业务需求,来对 日志查询模块的性能进行优化。

1) 分页查询优化

由于在进行日志查询时,是进行分页查询,那也就意味着,在查看时,至少需要查询两次:

A. 查询符合条件的总记录数。--> count 操作

B. 查询符合条件的列表数据。--> 分页查询 limit 操作

通常来说,count() 都需要扫描大量的行(意味着需要访问大量的数据)才能获得精确的结果,因此是很难对该 SQL进行优化操作的。如果需要对count进行优化,可以采用另外一种思路,可以增加汇总表,或者redis缓存来专 门记录该表对应的记录数,这样的话,就可以很轻松的实现汇总数据的查询,而且效率很高,但是这种统计并不能 保证百分之百的准确 。对于数据库的操作,“快速、精确、实现简单”,三者永远只能满足其二,必须舍掉其中一 个。

2) 条件查询优化

针对于条件查询,需要对查询条件,及排序字段建立索引。

3) 读写分离

通过主从复制集群,来完成读写分离,使写操作走主节点, 而读操作,走从节点。

4) MySQL服务器优化

5) 应用优化

性能优化 - 分页 

优化count 

没有特别好的方案。下面是官方提供的一种优化方案。

 

用一张表记录数据量来代替count(*)

弊端:每次插入数据会更新。条件搜索有问题。(不通用)

优化 limit 

在进行分页时,一般通过创建覆盖索引,能够比较好的提高性能。一个非常常见,而又非常头疼的分页场景就是 "limit 1000000,10" ,此时MySQL需要搜索出前1000010 条记录后,仅仅需要返回第 1000001 到 1000010 条记 录,前1000000 记录会被抛弃,查询代价非常大。

 

 

 通过子查询优化。

还要改变后端SQL调用文件

 

 

 

 性能优化 - 索引 

当根据操作人进行查询时, 查询的效率很低,耗时比较长。原因就是因为在创建数据库表结构时,并没有针对于操作人字段建立索引。

为了查询效率高,我们也需要对 操作方法、返回值类型、操作耗时 等字段进行创建索引,以提高查询效率。

性能优化 - 排序

 在查询数据时,如果业务需求中需要我们对结果内容进行了排序处理 , 这个时候,我们还需要对排序的字段建立适当 的索引, 来提高排序的效率 。

 

 

 

性能优化 - 读写分离 

在Mysql主从复制的基础上,可以使用读写分离来降低单台Mysql节点的压力,从而来提高访问效率,读写分离的 架构如下:

 

写在主服务器,读在从服务器

对于读写分离的实现,可以通过Spring AOP 来进行动态的切换数据源,进行操作 :

spring aop将写分配给主服务器,读分配给从服务器。

1)先把读、写数据源引入。

 

 

 

 2)数据源配置

记录哪些方法走哪些数据源ChooseDataSource:

 

 

 

记录当前所使用的数据源(DataSourceHandler)

 

配置类写好后,写datasource去引用

 

 其中targetDataSources是父类中的方法。(数据源选择)

methodType(设置方法前缀名对应的数据源)

用的是set注入。

 

根据type判断是读的还是写的,然后保存read或write(DataSourceAspect)

 

 

 

 

 性能优化 - 应用优化

 

1)增加缓存

2)在数据量很大的时候(千万级别)使用全文检索服务。可以考虑加入Solr 或 者 ElasticSearch全文检索服务,来提高访问效率。

3)非关系数据库。也可以考虑将非核心(重要)数据,存在 MongoDB 中,这样可以提高插入以及查询的效率

 

-----------------------------------------------------------------------------------------------------------------------------------------

内容有:SQL优化、应用优化、Mysql查询的缓存优化、Mysql内存管理及优化、Mysql并发参数调整、Mysql锁问题、常用的SQL技巧、MySQL中常用工具、MySQL日志、MySQL复制、综合案例

------------------------------------------------------------------------------------------------------------------------------------------

图片是课件,打字大部分是自己思考,若有错误请指出。

第三天结束了,虽然晚了快一个小时,算是三天吧(囧)最后综合案例没实操,就是简单地学习知识,若是有空就实操吧。

 

 

 

 

 

posted @ 2022-05-18 00:48  happy_game  阅读(103)  评论(0)    收藏  举报