条件查询
-- 1、关系运算符:> < >= <= = <> (也可以用!=,是一种宽容处理,不建议) select count(last_name),last_name,first_name FROM employees WHERE salary<>20000?? ?-- 聚集函数只能显示一行 -- 2、按逻辑表达式筛选:and or -- 3、范围表达式:between and,not between and -- 4、确定集合:in,not in -- 5、字符匹配:like,not like -- 6、空值:is null ,is not null
select last_name,first_name,manager_id FROM employees limit 0,3
select last_name,first_name FROM employees WHERE commission_pct is NULL
嵌套查询
-- 1、in
不相关子查询:子查询不依赖父级参数
select * from student where sdep in(select * from sdept)
-- 2、单一关系子查询,即子查询只会返回一条记录
相关子查询:子查询依赖父级参数
select sno,sname,grade
from sc x
where grade >= (
select AVG(grade) from sc y
where x.sno = y.sno
)
-- 3、(any、all)多关系子查询,即子查询会返回多条记录
相关的关系函数格式:>any、>all、<any、<all、>=any、>=all、<=any、<=all、=any、=all、<>any、<>all
select sname,sage
from student
where sdept<any(
select sage
from student
where sdept = 'cs'
)
-- 4、exists子查询:存在返回true,反之false,比如select *,只要有一条记录就返回true
select sname
from student
where exists(
select *
from sc
where sno = student.sno and cno = '1'
)
集合查询
-- 1、union:并集
select * from student where sdept = 'cs'
union
select * from student where sage <= 19
-- 2、intersect:交集
select * from student where sdept = 'cs'
intersect
select * from student where sage <= 19
-- 3、except:差集,如下获取院系为cs的19岁以上学生
select * from student where sdept = 'cs'
except
select * from student where sage <= 19
派生表查询
select sno,cno
from sc,(select sno,avg(grade) from sc group by sno)
as avg_sc(avg_sno,avg_grade) //临时表
where sc.sno = avg_sc.avg_sno and sc.grade >= avg_sc.avg_grade
排序查询
-- 排序查询,另外讲下查询顺序,先from表,然后where条件查询,接着select,最后order by?
select last_name,first_name,salary FROM employees WHERE commission_pct is NULL ORDER BY salary,first_name DESC
select last_name,first_name,salary FROM employees WHERE commission_pct is NULL ORDER BY first_name DESC,salary
常见函数
-- 常见函数:字符函数、数学函数、日期函数、流程控制函数、自定义函数 -- 1、字符函数 -- 拼接:CONCAT(str1,str2,...)?? ? select CONCAT(first_name,last_name,IFNULL(commission_pct,"null")) FROM employees -- 获取字节长度:LENGTH(str) select LENGTH(first_name) FROM employees -- 获取字符长度:CHAR_LENGTH(str) select CHAR_LENGTH(first_name) FROM employees -- 截取子串:SUBSTR(str FROM pos FOR len) SELECT SUBSTR('张三丰爱上了郭襄',1,3) -- 替换数据:INSERT select INSERT('mysql',1,2,'MY') -- 获取字符第一次出现的索引:INSTR(str,substr) select INSTR('中华人民共和国和中华民国的那些事儿','中华') -- 去除前后空格:TRIM([remstr FROM] str) select TRIM(' ?虚 ?竹 ?') -- 去除前后指定的字符:TRIM([remstr FROM] str) select TRIM('xy' FROM 'xyxxx虚xx竹xxxxxy') -- 去掉左边/右边指定字符 select LTRIM(' ? ? 虚 ?竹 ?') select RTRIM(' ? ? 虚 ?竹 ?') -- 返回字符串str最左边/右边的len个字符:LEFT(str,len)/RIGHT(str,len) select LEFT('str',2) select RIGHT('str',2) -- LPAD/RPAD 左填充/右填充,结果都一样只是方向不同 select LPAD('木婉清',3, 'a') select RPAD('木婉清',10,'a') -- UPPER/LOWER 大小写 select UPPER('abcd')
-- 案例:查询员工表的姓名,要求格式:姓首字符大写,其它字符小写,名所有字符大写,且姓和名之间用_分割,最后起别名为OUTPUT select UPPER(SUBSTR(first_name,1,1)),first_name FROM employees select LOWER(SUBSTR(first_name,2)),first_name FROM employees select UPPER(last_name) FROM employees select concat(UPPER(SUBSTR(first_name,1,1)),LOWER(SUBSTR(first_name,2)),'_',UPPER(last_name)) OUTPUT FROM employees
-- STRCMP(expr1,expr2) 比较 select STRCMP('A','a') select STRCMP('B','a') -- 2、数学函数 -- 绝对函数:ABS(X) select abs(-2.6) -- 向上取整:CEIL(X) select CEIL(1.09) -- 四舍五入 select ROUND(1.87123) -- 四舍五入小数点后保留三位 select ROUND(1.87123,3) -- 截断:truncate select TRUNCATE(1.87,1) select TRUNCATE(1.87,0) -- 取余数:MOD(N,M) select MOD(-10,3) select 3/10 -- 3、日期函数 select NOW() select CURDATE() select CURTIME() select DATEDIFF('2019-7-13','1998-7-16') select DATE_FORMAT('2019-7-13 18:20:20','%Y年%m月%d日 %H小时%i分钟%s秒') select STR_TO_DATE('3/15 1998','%m/%d %Y') select * from employees WHERE hiredate < STR_TO_DATE('3/15 1998','%m/%d %Y')
-- 4、流程控制 SELECT IF ( 100 > 9, '好', '坏'? )
SELECT ?? ?department_id, ?? ?salary, CASE ?? ?department_id? ?? ?WHEN 30 THEN ?? ?1? ?? ?WHEN 50 THEN ?? ?2 ELSE 3? ?? ?END result? FROM ?? ?employees
聚合函数/统计/分组函数
-- 聚合/统计函数
COUNT(DISTINCT expr,[expr...]) MAX(expr) MIN(expr) AVG([DISTINCT] expr) SUM(expr) -- 补充:一般查询count直接用*,意思是只要查询行有字段不为null就算上,相对快速 COUNT(*)
-- 分组 select count(*),salary from employees? -- 分组+HAVING:having是对统计函数作条件过滤 select COUNT(*),AVG(salary) avg from employees GROUP BY salary HAVING avg>4000
连接
1.笛卡尔连接:
????????select * from tableA,tableB...
2.内连接
????????2.1.内连接:SELECT * FROM student INNER JOIN score ON student.studentno=score.studentno
????????2.2.等值连接:基于笛卡尔积,添加等值条件:SELECT * FROM student, score WHERE student.studentno=score.studentno
????????2.3.不等值连接:同等值连接,只是运算符包括>、>=、<=、<、!>、!<和<>。
????????2.4.自然连接:有去重功能的内连接,比如两张表有同名同类型字段,联表查询结果一般会显示两列该字段,而自然连接可以去重,保证只显示一列即可:SELECT ... FROM ... NATURAL JOIN ... ON ...=...
3.外连接
????????3.1.左[外]连接:select * from student LEFT JOIN score ON student.studentno=score.studentno
????????3.2.右[外]连接:select * from student RIGHT JOIN score ON student.studentno=score.studentno
????????3.3.全连接:select * from student FULL JOIN score ON student.studentno=score.studentno
例题
1、简单的两表查询
use myemployees
select last_name,department_name FROM employees e,departments d
2、添加筛选条件
查询部门编号>100的部门名和所在的城市名
查询有奖金的员工名、部门名
查询城市名中第二个字符为o的部门名和城市名
3、添加分组+筛选 查询每个城市的部门个数 查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资 查询部门中员工个数>10的部门名
4、添加分组+筛选+排序 查询部门中员工个数>10的部门名,并按照部门名降序 查询每个工种的员工个数和工种名,并按照个数降序
5、三表连接 案例查询员工名、城市名
常用类型
整型 tinyint smallint int bigint 浮点型 double(m,n) float decimal?? ?m表示总长,n表示小数点后保留位数 字符型 char varchar text 二进制,用来存储图形数据 blob 日期型 date?? ?格式:yyyy-MM-dd? time?? ?格式:hh:mm:ss timestamp?? ?格式:yyyyMMdd hhmmss datetime 格式:yyyy-MM-dd hh:mm:ss
六大约束
not null default? primary key FOREIGN KEY unique? check
例如:create table sc( ?? ?sno char(9) [not null,unique,PRIMARY KEY], ?? ?cno char(4), ?? ?grade SMALLINT, ?? ?[PRIMARY key(sno,cno),] ?? ?[FOREIGN KEY(sno) REFERENCES student(sno),] ?? ?[check(grade<>0 and grade>60)] )
四大SQL语句
1、DDL (database definition language) 创表 CREATE TABLE IF NOT EXISTS xxx; 删表 drop table if exists xxx [RESTRICT/CASCADE]; 修改:ALTER TABLE 语句用于在已有的表中添加、修改或删除列,。 1. ALTER TABLE table_name ADD column_name datatype 2. ALTER TABLE table_name DROP COLUMN ?column_name 3. ALTER TABLE table_name ALTER COLUMN column_name datatype 4. ALTER TABLE table_name RENAME COLUMN column_name to newname 5. ALTER TABLE table_name RENAME to newname 复制表 ?? ?复制结构+数据 ?? ?create table xxx select * from yyy ?? ?create table xxx select * from yyy.column ?? ?复制结构 ?? ?create table xxx like yyy
2、DML(database manipulate language)
delete from tablename
update tablename set colume = newvalue where ...
insert into tablename values(...)
3、DQL
select * from tablename [lock on share mode|for update]
4、DCL
rollback、commit、grant...
存储引擎
innodb默认事务自动开启
1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;?
2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;?
3. InnoDB支持主键
4. InnoDB是聚簇索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。而辅助(非聚簇)索引需要两次查询,先查询到主键,然后再通过主键查询到数据。
5. 5.6版本后InnoDB也支持了全文索引
6. InnoDB不只支持表锁还支持行锁
7.?Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
? ? ? ? Innodb:frm是表定义文件,ibd是结构+数据文件
? ? ? ? Myisam:frm是表定义文件,myd是数据文件,myi是索引文件
事务
show variables like '%auto%' 关闭自动提交 set autocommit =0 开启手动事务 start TRANSACTION 编写事务的sql语句 ... 提交或者回滚(如果在执行时有上行锁) commit or rollback
举例 START TRANSACTION select count(*) FROM departments delete FROM departments where department_id = 1 select count(*) FROM departments ROLLBACK
ACID:原子性、一致性、隔离性、永久性
1、查看当前会话的 隔离级别: select @@tx_isolation; 2、查看系统的隔离级别: select @@global.tx_isolation; 3、设置会话的隔离级别,隔离级别由低到高设置依次为: set session transaction isolation level read uncommitted; set session transaction isolation level read committed; set session transaction isolation level repeatable read; set session transaction isolation level serializable; 4、设置当前系统的隔离级别,隔离级别由低到高设置依次为: set global transaction isolation level read uncommitted; set global transaction isolation level read committed; set global transaction isolation level repeatable read;
【注:】mysql默认的事务处理级别是'REPEATABLE-READ',而Oracle和SQL Server是READ_COMMITED
锁
SQL语句归根结底是读写操作,因而只有读写锁,而读写锁根据加锁范围又分为行锁和表锁:
行锁( 是读写锁、是可重入锁、是行锁/间隙锁、是悲观锁)
?? ?行锁的劣势:开销大;加锁慢;会出现死锁
?? ?行锁的优势:锁的粒度细(就是锁多,越细越多,越粗越少),发生锁冲突的概率低;处理并发的能力强
?? ?上锁方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁;当然我们也可以显示的加锁:
?? ??? ?1、读/共享锁:select * from tableName where … + lock in share more
?? ??? ?2、写/独占锁/排他锁:select * from tableName where … + for update、UPDATE、DELETE 和 INSERT
?? ?上锁时机:SQL执行语句时 ?? ? ?? ?解锁时机:有事务的话要到commit/rollback时解锁,无事务执行完SQL时解锁
表锁(是读写锁、是表锁、是可重入锁、是悲观锁)
? ? 表锁的劣势:并发慢,锁冲突可能性大 ?? ? ?? ?表锁的优势:锁粒度粗,资源占用少 ?? ? ?? ?一般表锁上锁/解锁时机:
?? ??? ?1、读/共享锁(S锁):lock/unlock table 表名 read
?? ??? ?2、写/独占锁(X锁):lock/unlock table 表名 write ?? ??? ? ?? ??? ?3、全部解锁:unlock tables,必须手动解锁,不像行锁,事务或语句结束后自动解锁 ?? ??? ? ?? ??? ?4、表锁的兼容性(即表级S、X兼容性) ?? ??? ? ?? ??? ??? ??? ??? ??? ?S ? ? ?X ?? ??? ??? ?S ? ?? ?+ ? ? ?- ?? ??? ??? ?X ??? ??? ?- ? ? ?-
意向锁(是读写锁、是表锁、是可重入锁、是悲观锁)。
? ? ? ? ? ?1、作用仅为了解决行锁和表锁冲突:例如事务A加了行锁,事务B想加表锁,B需要遍历每行查看是否有行锁,而等查到事务A的行锁时已经花了很长时间,为了解决这种问题引入了意向锁,意向锁是一种表级读写锁,加行锁前先加意向锁,这样当事务B要加表锁时只需要查看是否加了表锁或者意向锁即可,效率提升;
? ? ? ? ? ?2、意向锁不操心行锁与行锁间的冲突:如果两个事务都申请意向锁,则意向锁间相互兼容(即 IS和IX、IS和IS、IX和IS 间相互兼容),因为1中已经说了在加行锁前才会加意向锁,所以当前实际是行锁间冲突,而行锁机制会解决并发问题,不需要意向锁来操心 ?? ??? ??? ? ? ? ? ? ? ?3、意向锁IS、IX和表级锁S和X的冲突: ?? ??? ? ?? ??? ??? ??? ??? ??? ??? ?IS ? ? IX ? ? ?S ? ?X ?? ??? ??? ??? ?IS ? ? ????+ ? ? ?+ ? ? ?+? ? ?- ?? ??? ??? ??? ?IX? ? ? ? ?+ ? ? ?+ ? ? ?-? ? ? - ?? ??? ??? ??? ?S? ? ? ? ? + ? ? ?-? ? ? ?+? ? ? - ?? ??? ??? ??? ?X? ? ? ? ? -? ? ? -? ? ? ? -? ? ? ?- ?? ??? ? ?? ??? ?上锁/解锁时机:MySQL加行锁前先自动加上意向锁,解锁时如果有事务的话commit/rollback时解锁,如果没有事务SQL语句结束就释放锁 ?? ??? ??? ??? ??? ? ?? ??? ?读写锁:意向锁是表层级的读写锁,分为意向共享锁(IS锁)、意向独占锁(IX锁),只要有s锁就上is锁,共享s锁,隔离x锁、ix锁
? ? ? ? 上锁时机:SQL执行语句时 ?? ? ? ? ? ? 解锁时机:有事务的话要到commit/rollback时解锁,无事务执行完SQL时解锁
缓存
MySQL缓存 https://zhuanlan.zhihu.com/p/55947158#:~:text=MySQL%E8%83%BD%E5%A4%9F%E7%BC%93%E5%AD%98%E7%9A%84%E6%9C%80%E5%A4%A7%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C%EF%BC%8C%E6%9F%A5%E8%AF%A2%E7%BB%93%E6%9E%9C%E5%A4%A7%E4%BA%8E%E8%AF%A5%E5%80%BC%E6%97%B6%E4%B8%8D%E4%BC%9A%E8%A2%AB%E7%BC%93%E5%AD%98%E3%80%82,%E9%BB%98%E8%AE%A4%E5%80%BC%E6%98%AF1048576%20%281MB%29%E5%A6%82%E6%9E%9C%E6%9F%90%E4%B8%AA%E6%9F%A5%E8%AF%A2%E7%9A%84%E7%BB%93%E6%9E%9C%E8%B6%85%E5%87%BA%E4%BA%86%E8%BF%99%E4%B8%AA%E5%80%BC%EF%BC%8CQcache_not_cached%E7%9A%84%E5%80%BC%E4%BC%9A%E5%8A%A01%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%9F%90%E4%B8%AA%E6%93%8D%E4%BD%9C%E6%80%BB%E6%98%AF%E8%B6%85%E5%87%BA%EF%BC%8C%E5%8F%AF%E4%BB%A5%E8%80%83%E8%99%91%E5%9C%A8SQL%E4%B8%AD%E5%8A%A0%E4%B8%8ASQL_NO_CACHE%E6%9D%A5%E9%81%BF%E5%85%8D%E9%A2%9D%E5%A4%96%E7%9A%84%E6%B6%88%E8%80%97%E3%80%82 MySQL缓存的应用场景 https://www.jianshu.com/p/63ce65e4dc23
总的来说MySQL缓存用的比较少,在大数据量、小并发、变动小的系统中非常适用,高并发时还是用分布式缓存吧
索引
以innoDB为例,创建表时通过B树实现了主键的聚簇索引,因此查询时想要发挥B树的快查威力就必须用主键查询,但一般SQL查询都是以主键以外的字段查询,因此需要以常用的查询字段建立非聚簇索引
索引添加
1 新建表中添加索引
① 普通索引
create table t_dept(
no int not null primary key,
name varchar(20) null,
sex varchar(2) null,
info varchar(20) null,
index index_no(no) //基于索引的colume设置索引名,比如no,则命名格式为index_no
)
② 唯一索引
create table t_dept(
no int not null primary key,
name varchar(20) null,
sex varchar(2) null,
info varchar(20) null,
unique index index_no(no)
)
③ 全文索引
create table t_dept(
no int not null primary key,
name varchar(20) null,
sex varchar(2) null,
info varchar(20) null,
fulltext index index_no(no)
④ 多列索引
create table t_dept(
no int not null primary key,
name varchar(20) null,
sex varchar(2) null,
info varchar(20) null,
key index_no_name(no,name)
)
2 在已建表中添加索引
① 普通索引
create index index_name //index_name是索引名
on t_dept(name); //t_dept是表名
② 唯一索引
create unique index index_name
on t_dept(name);
③ 全文索引
create fulltext index index_name
on t_dept(name);
④ 多列索引
create index index_name_no
on t_dept(name,no)
3 以修改表的方式添加索引
① 普通索引
alter table t_dept
add index index_name(name);
② 唯一索引
alter table t_dept
add unique index index_name(name);
③ 全文索引
alter table t_dept
add fulltext index_name(name);
④ 多列索引
alter table t_dept
add index index_name_no(name,no);
?以下情况适合创建索引
-
在经常需要搜索的列上,可以加快搜索的速度。 -
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。 -
在经常用于连接两张表的列上,这些列主要是一些外键,可以加快连接的速度。 -
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。 -
在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。 -
在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
以下情况不适合创建索引
-
表记录太少。 -
经常增删改的表。 -
数据重复且分布平均的表字段,因此应该只为最经常查询和经常排序的数据列建立索引(如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果) 索引失效的场景 https://blog.csdn.net/Dxy1239310216/article/details/121679668
调优
????????写一手高效的sql 也是需要功力的,知道清楚如何避免索引失效
慢SQL调优 https://blog.csdn.net/flycp/article/details/108084388?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165321001516781483780109%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165321001516781483780109&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-108084388-null-null.142%5Ev10%5Econtrol,157%5Ev4%5Econtrol&utm_term=%E6%85%A2SQL%E8%B0%83%E4%BC%98&spm=1018.2226.3001.4187
索引调优 https://zhuanlan.zhihu.com/p/61687047
小表驱动大表 https://blog.csdn.net/fly_miqiqi/article/details/90348800
存储过程
存储过程 https://blog.csdn.net/qq_36777191/article/details/104171953
存储函数
触发器
触发器 https://blog.csdn.net/qq_36777191/article/details/104190013
三大日志
? ? ? ? 即redolog、binlog、undolog
????????redolog
? ? ? ? 1、是innoDB的日志,物理存储;
? ? ? ? 2、任务是宕机重启后保证数据一致性;
? ? ? ? 3、记录事务,当事务结束时并不会立即刷新到磁盘,而是通过redo buffer记录到redolog,然后再异步刷进ibd;
? ? ? ? 4、redolog写入ibd的那部分数据就相当于过期了,redolog会用新数据覆盖那部分数据,也因此redolog日志是可重复使用的持久化文件
????????binlog
? ? ? ? 1、是MySQL的日志,逻辑存储;
? ? ? ? 2、任务是日志分析,主从同步,数据恢复;
? ? ? ? 3、记录数据变动,记录方式有row、statement和miexd
? ? ? ? ? ? ? ? row:比如某行某个字段变为了***,优点是记录细致,缺点资源大
? ? ? ? ? ? ? ? statement:就是SQL语句,优点省资源,缺点主从模式下如果有函数容易不一致,比如now(),uuid()
? ? ? ? ? ? ? ? mixed:自动选择用row还是statement
????????redolog和binlog的区别
? ? ? ? 1、redo log是在InnoDB存储引擎层产生,而binlog是MySQL数据库的上层产生的,并且二进制日志不仅仅针对INNODB存储引擎,MySQL数据库中的任何存储引擎对于数据库的更改都会产生二进制日志。
? ? ? ? 2、两种日志记录的内容形式不同。MySQL的binlog是逻辑日志,其记录是对应的SQL语句。而innodb存储引擎层面的重做日志是物理日志。
? ? ? ? 3、两种日志与记录写入磁盘的时间点不同,二进制日志只在事务提交完成后进行一次写入。而innodb存储引擎的重做日志在事务进行中不断地被写入,并且日志不是随事务提交的顺序进行写入的。
?????????4、binlo在写满或者重启之后,会新产生binlog文件,而redo log是循环使用。
????????5、binlog作为数据分析,数据恢复,主从同步使用,而redo log会参与到ibd的数据持久化流程,目的是异常宕机或者介质故障时恢复数据。?

binlog在主从复制中的应用
?
可以看出redolog参与了ibd的数据持久化,redlolog的地位非常重要?
????????undolog????????
? ? ? ? 1、实现事务的原子性:undo log可以用于实现事务的原子性, 如果事务处理过程出现一些特殊情况,比如sql错误等等情况,就要执行回滚(rollback)操作,mysql就可以利用undo log将数据恢复到事务开始之前
? ? ? ? 2、实现多版本并发控制(MVCC):undo log 在 MySQL InnoDB 存储引擎中用来实现多版本并发控制,事务没提交之前,undo日志可以作为高并发情况下,其它并发事务进行快照读
好文推荐
??binlog https://blog.csdn.net/Allenzyg/article/details/106446992??redolog的作用和原理 https://blog.csdn.net/qq_42773863/article/details/120988441?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165324292716782425142146%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165324292716782425142146&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-120988441-null-null.142^v10^control,157^v4^control&utm_term=redolog+ibd&spm=1018.2226.3001.4187redolog和binlog的区别 https://blog.csdn.net/wanbin6470398/article/details/81941586
undolog https://blog.csdn.net/u014427391/article/details/109022361 三大日志 https://javaguide.cn/database/mysql/mysql-logs.html#%E5%89%8D%E8%A8%80集群
????????集群就是n主m从的布局,总的来说主从复制的逻辑在于主机写,从机读。从单体架构往集群架构发展的大概逻辑:
- 把单体架构的ibd复制到扩展机器,
- 主机设置binlog记录事件,
- binlog数据同步到从机,从机记录到relaylog,然后flush到从机磁盘
好文推荐
主从复制 https://blog.csdn.net/qq_21153619/article/details/81529880
主从复制 https://blog.csdn.net/weixin_30539317/article/details/113281081?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%20MySQL%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-113281081.142^v10^control,157^v4^control&spm=1018.2226.3001.4187relaylog和binlog实现MySQL的主从同步原理 https://blog.csdn.net/javaanddonet/article/details/112596148
|