日志和索引的相关问题
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;
以上是关于日志和索引的相关问题的主要内容,如果未能解决你的问题,请参考以下文章