日志和索引的相关问题

Posted hanguocai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志和索引的相关问题相关的知识,希望对你有一定的参考价值。

一:日志相关问题.

技术分享图片

这里的commit 步骤在事务提交之后执行的。

在A 阶段数据库奔溃重启后,binlog没有写入,那么从库没有数据。主库也会回滚。

在B阶段数据库奔溃重启后,redolog会拿着xid去binlog中去找,如果找到就提交。就可以崩溃恢复

(1)mysql如何知道binlog的完整性? binlog有一定的语句格式

(2)redo log binlog如何关联?俩阶段提交流程,还有xid

(3)binlog不支持数据恢复,只是用来归档 ,它没有记录数据页的相关信息。

(4)redo log提交了就不能回滚 了。它是循环写,起不了归档的作用

(5)先写redolog buffer ,还是redo log? 事务提交的时候才写redo log ,首先是在redo log buffer中记录下来 ,事务提交的时候,从buffer中写入到 redo log 中。

 

一个有趣的问题

CREATE TABLE `like` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `liker_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_id_liker_id` (`user_id`,`liker_id`)
) ENGINE=InnoDB;

CREATE TABLE `friend` (
  id` int(11) NOT NULL AUTO_INCREMENT,
  `friend_1_id` int(11) NOT NULL,
  `firned_2_id` int(11) NOT NULL,
  UNIQUE KEY `uk_friend` (`friend_1_id`,`firned_2_id`)
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

 

技术分享图片

 

 

 mysql> begin; /* 启动事务 */
insert into `like`(user_id, liker_id, relation_ship) values(A, B, 1) on duplicate key update relation_ship=relation_ship | 1;
select relation_ship from `like` where user_id=A and liker_id=B;
/* 代码中判断返回的 relation_ship,
  如果是 1,事务结束,执行 commit
  如果是 3,则执行下面这两个语句:
  */
insert ignore into friend(friend_1_id, friend_2_id) values(A,B);
commit;

mysql> begin; /* 启动事务 */
insert into `like`(user_id, liker_id, relation_ship) values(B, A, 2) on duplicate key update relation_ship=relation_ship | 2;
select relation_ship from `like` where user_id=B and liker_id=A;
/* 代码中判断返回的 relation_ship,
  如果是 1,事务结束,执行 commit
  如果是 3,则执行下面这两个语句:
*/
insert ignore into friend(friend_1_id, friend_2_id) values(B,A);
commit;

 





































以上是关于日志和索引的相关问题的主要内容,如果未能解决你的问题,请参考以下文章

:日志和索引相关问题

:日志和索引相关问题

15 | 答疑文章:日志和索引相关问题

MySQL索引相关

MySQL索引相关 𱌑

kafka-Message日志和索引文件消费组rebalance