6.4 数据库:
1、B树与B+树?(4)
https://blog.csdn.net/qq_26222859/article/details/80631121
https://www.cnblogs.com/lianzhilei/p/11250589.html
2、乐观锁&悲观锁?如何实现?(3)
https://www.php.cn/mysql-tutorials-353860.html
一、悲观锁
1、排它锁,当事务在操作数据时把这部分数据进行锁定,直到操作完毕后再解锁,其他事务操作才可操作该部分数据。这将防止其他进程读取或修改表中的数据。
2、实现:大多数情况下依靠数据库的锁机制实现
一般使用 select ...for update 对所选择的数据进行加锁处理,例如select * from account where name=”Max” for update, 这条sql 语句锁定了account 表中所有符合检索条件(name=”Max”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
二、乐观锁
1、如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户重新操作。
2、实现:大多数基于数据版本(Version)记录机制实现
具体可通过给表加一个版本号或时间戳字段实现,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断当前版本信息与第一次取出来的版本值大小,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,拒绝更新,让用户重新操作。
在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法
3、联合索引?最左匹配原则?(3)
https://www.jb51.net/article/157920.htm
4、数据库事务?mysql事务隔离级别?(2)https://cyc2018.github.io/CS-Notes/#/notes/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B3%BB%E7%BB%9F%E5%8E%9F%E7%90%86
强力推荐这个人。
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
一个事务所做的修改在最终提交以前,对其它事务是不可见的。
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
系统发生奔溃可以用重做日志(Redo Log)进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改。
事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系:
5、索引是什么 ? 数据库索引有哪些? 索引的优缺点? http://baijiahao.baidu.com/s?id=1641311517406582639&wfr=spider&for=pc https://www.jianshu.com/p/0569644498fc
② 索引的通俗解释
索引就像是图书的目录,根据目录中的页码快速找到所需内容。
③ 索引在百度百科中的解释
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
1.普通索引 ,最基本的索引,它没有任何限制,用于加速查询
创建方法:
1.创建表的时候一起创建
CREATE TABLE mytable(
name VARCHAR(32),
INDEX index(name);
);
2.建立表之后 直接创建索引
CREATE INDEX index ON mytable(name);
3.修改表的结构
ALTER TABLE mytable ADD INDEX index ON mytable(name(11));
2.唯一索引 索引的列的值必须是唯一的但是允许有空值 如果是组合索引 则列的组合必须是唯一的
创建方法:
1.创建表的时候一起创建
CREATE TABLE mytable(
name VARCHAR(32),
UNIQUE index(name);
);
2.建立表之后 直接创建索引
CREATE UNIQUE INDEX index ON mytable(name);
3.修改表的结构
ALTER TABLE mytable ADD UNIQUE INDEX index ON mytable(name(11));
3.主键索引 是一种特殊的唯一索引 一个表只有一个主键 不能有空值 一般在建表的时候同时创建主键索引
1.创建表的时候一起创建
CREATE TABLE mytable (
id int(11) NOT NULL AUTO_INCREMENT ,
name VARCHAR(32) ,
PRIMARY KEY (id)
);
2.修改表的结构
ALTER TABLE mytable ADD CONSTRAINT t1_pk PRIMARY KEY (id);
4.组合索引 是指多个字段上创建的索引 只有在查询条件中使用了创建索引的第一个字段 索引才会被使用 使用组合索引应该遵循最左前缀集合
a. 建表的时候一起创建
CREATE TABLE mytable (
`id` int(11) ,
`name` VARCHAR(32) ,
INDEX index_mytable_id_name (`id`,`name`)
);
b. 建表后,直接创建索引
CREATE INDEX index_mytable_id_name ON mytable(id,name);
c. 修改表结构
ALTER TABLE mytable ADD INDEX index_mytable_id_name (id,name);
5.全文索引 主要用来查找文本中的关键字 而不是直接与索引中的值相比较
更像是一个搜索引擎不是简单的where参数匹配 全文索引配合match agains使用
创建方法:
a. 建表的时候一起创建
CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(250) NOT NULL , `contents` text NULL , `create_at` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (contents) );
b. 建表后,直接创建索引
CREATE FULLTEXT INDEX index_article_contents ON article(contents);
c. 修改表结构
ALTER TABLE article ADD FULLTEXT INDEX index_article_contents (contents);
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
6、redis了解吗?一致性哈希如何优化(虚拟结点)?(2)
7、数据库引擎(innodb、mysima)?(2)
8、数据库优化(如何定位慢查询?如何改进?)?(1)
数据库引擎
事务中的修改,即使没有提交,对其它事务也是可见的。
一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。
保证在同一个事务中多次读取同一数据的结果是一样的。
强制事务串行执行,这样多个事务互不干扰,不会出现并发一致性问题。
该隔离级别需要加锁实现,因为要使用加锁机制保证同一时间只有一个事务执行,也就是保证事务串行执行。