首页 > 编程知识 正文

oracle自增序列(oracle19c用户名密码拒绝)

时间:2023-05-03 20:47:01 阅读:85048 作者:4191

一、 索引

索引,就像书籍的目录一样,可以从有目录的页码中马上找到对应的内容。

索引的优点:1.天生排序。 2 .快速搜索。

索引缺点:1.占用空间。 2 .降低表的更新速度。

注意:小表最好使用全表扫描。 大表使用索引。 超级表索引基本上是无效的。

索引在安装上分为集合索引和辅助索引两种。 (也称为辅助索引或非集合索引) )。

从功能上来说,通常分为索引、唯一索引、主键索引、复合索引、外键索引、全文索引6种。

详细谈论六种索引:

1、普通索引:是最基本的索引,没有任何限制。

2、独特的索引:与通常的索引相似,但有独特的限制。

3、主键索引:是特殊的唯一索引,不允许空值。

4、复合索引:可以将多列组合起来编制索引,复盖多列。

5、外键索引:只有InnoDB类型的表可以使用外键索引,以保证数据的完整性、完整性、级联操作。

6、全文索引: MySQL拥有的全文索引只能用于InnoDB、MyISAM。 另外,只能全文检索英语。 一般使用全文索引引擎(ES,Solr )。

注意:主键是唯一的索引,但唯一的索引不一定是主键。 唯一索引可以为空,但只有一个空值,主键不能为空。 另外,InnoDB使用主键对数据进行集群。 如果未定义主键,未定义聚合索引,则MySql将选择唯一的非空索引。 如果没有这些索引,则会隐式定义一个6字节的主键作为群集索引,用户无法查看或访问。

简单地说:

设置主键时,会自动生成唯一的索引。 如果以前没有聚合索引,则主键为聚合索引。 如果未设置主键,则会选择一个非空的唯一索引作为聚合索引,如果尚未设置,则会生成隐式6字节索引。 MySql每页存储数据,缺省每页为16kb。 讲究的香菇在查询时,不是只加载某一个数据,而是将所有有该数据的页面加载到pageCache中。 这其实和操作系统的最近访问原理很相似。

MySql的索引使用b树结构。 在谈论b树之前,让我们先来谈谈b树。 的树是一种多重平衡搜索树,与普通二叉树相比,不发生极端不平衡的情况,同时也是多重的。

b树的特点是他把数据也保存在非页面子节点上。

从图中可以看出:

此特性阻止了非页面子节点存储大量索引。

B-tree是对此进行了B-tree优化的结果。 如下图所示。

可以看到,B Tree将所有数据数据保存在叶节点上,而非也子节点只保存索引和指针。

设非页面子节点为16kb,各索引即主键为bigint,即8b,指针为8b。 每页可存储约1000个索引(16kb/8b 8b ) )。

三层树能存储多少索引? 下图:

gn-justify">大约能够存储 10 亿个索引。通常 B+ 树的高度在 2-4 层,由于 MySql 在运行时,根节点是常驻内存的,因此每次查找只需要大约 2 -3 次 IO。可以说,B+ 树的设计,就是根据机械磁盘的特性来进行设计的。

知道了索引的设计,我们能够知道另外一些信息:

MySql 的主键不能太大,如果使用 UUID 这种,将会浪费 B+ 树的非叶子节点。MySql 的主键最好是自增的,如果使用 UUID 这种,每次插入都会调整 B+树,从而导致页分裂,严重影响性能。

那么,如果项目中使用了分库分表,我们通常都会需要一个主键进行 sharding,那怎么办呢?在实现上,我们可以保留自增主键,而逻辑主键用来作为唯一索引即可。

二、 锁机制

关于 Mysql 的锁,各种概念就会喷涌而出,事实上,锁有好几种维度,我们来解释一下。

1. 类型维度

共享锁(读锁 / S 锁)排它锁(写锁 / X 锁)类型细分:意向共享锁意向排他(互斥)锁悲观锁(使用锁,即 for update)乐观锁(使用版本号字段,类似 CAS 机制,即用户自己控制。缺点:并发很高的时候,多了很多无用的重试)

2. 锁的粒度(粒度维度)

表锁页锁(Mysql BerkeleyDB 引擎)行锁(InnoDB)

3. 锁的算法(算法维度)

Record Lock(单行记录)Gap Lock(间隙锁,锁定一个范围,但不包含锁定记录)Next-Key Lock(Record Lock + Gap Lock,锁定一个范围,并且锁定记录本身, MySql 防止幻读,就是使用此锁实现)

4. 默认的读操作,上锁吗?

默认是 MVCC 机制(“一致性非锁定读”)保证 RR 级别的隔离正确性,是不上锁的。

可以选择手动上锁:select xxxx for update (排他锁); select xxxx lock in share mode(共享锁),称之为“一致性锁定读”。

使用锁之后,就能在 RR 级别下,避免幻读。当然,默认的 MVCC 读,也能避免幻读。

既然 RR 能够防止幻读,那么,SERIALIZABLE 有啥用呢?

防止丢失更新。例如下图:

这个时候,我们必须使用 SERIALIZABLE 级别进行串行读取。

最后,行锁的实现原理就是锁住聚集索引,如果你查询的时候,没有正确地击中索引,MySql 优化器将会抛弃行锁,使用表锁。

三、事务

事务是数据库永恒不变的话题, ACID:原子性,一致性,隔离性,持久性。

四个特性,最重要的就是一致性。而一致性由原子性,隔离性,持久性来保证。

原子性由 Undo log 保证。Undo Log 会保存每次变更之前的记录,从而在发生错误时进行回滚。隔离性由 MVCC 和 Lock 保证。这个后面说。持久性由 Redo Log 保证。每次真正修改数据之前,都会将记录写到 Redo Log 中,只有 Redo Log 写入成功,才会真正的写入到 B+ 树中,如果提交之前断电,就可以通过 Redo Log 恢复记录。

然后再说隔离性。

隔离级别:

未提交读(RU)已提交读(RC)可重复读(RR)串行化(serializable)

每个级别都会解决不同的问题,通常是3 个问题:脏读,不可重复读,幻读。一张经典的图:

这里有个注意点,关于幻读,在数据库规范里,RR 级别会导致幻读,但是,由于 Mysql 的优化,MySql 的 RR 级别不会导致幻读:在使用默认的 select 时,MySql 使用 MVCC 机制保证不会幻读;你也可以使用锁,在使用锁时,例如 for update(X 锁),lock in share mode(S 锁),MySql 会使用 Next-Key Lock 来保证不会发生幻读。前者称为快照读,后者称为当前读。

原理剖析:

RU 发生脏读的原因:RU 原理是对每个更新语句的行记录进行加锁,而不是对整个事务进行加锁,所以会发生脏读。而 RC 和 RR 会对整个事务加锁。RC 不能重复读的原因:RC 每次执行 SQL 语句都会生成一个新的 Read View,每次读到的都是不同的。而 RR 的事务从始至终都是使用同一个 Read View。RR 不会发生幻读的原因: 上面说过了。

那 RR 和 Serializble 有什么区别呢?答:丢失更新。本文关于锁的部分已经提到。

MVCC 介绍:全称多版本并发控制。

innoDB 每个聚集索引都有 4 个隐藏字段,分别是主键(RowID),最近更改的事务 ID(MVCC 核心),Undo Log 的指针(隔离核心),索引删除标记(当删除时,不会立即删除,而是打标记,然后异步删除);

本质上,MVCC 就是用 Undo Log 链表实现。

MVCC 的实现方式:事务以排它锁的方式修改原始数据,把修改前的数据存放于 Undo Log,通过回滚指针与数据关联,如果修改成功,什么都不做,如果修改失败,则恢复 Undo Log 中的数据。

多说一句,通常我们认为 MVCC 是类似乐观锁的方式,即使用版本号,而实际上,innoDB 不是这么实现的。当然,这不影响我们使用 MySql。

四、头条Java3面(事务+List集合+慢查询SQL+Redis+秒杀设计)

一面

讲讲jvm运行时数据库区讲讲你知道的垃圾回收算法jvm内存模型jmm内存泄漏与内存溢出的区别select、epool 的区别?底层的数据结构是什么?mysql数据库默认存储引擎,有什么优点优化数据库的方法,从sql到缓存到cpu到操作系统,知道多少说多少什么情景下做分表,什么情景下做分库linkedList与arrayList区别 适用场景array list是如何扩容的volatile 关键字的作用?Java 内存模型?java lock的实现,公平锁、非公平锁悲观锁和乐观锁,应用中的案例,mysql当中怎么实现,java中的实现

二面

Java 内存分配策略?多个线程同时请求内存,如何分配?Redis 底层用到了哪些数据结构?使用 Redis 的 set 来做过什么?Redis 使用过程中遇到什么问题?搭建过 Redis 集群吗?如何分析“慢查询”日志进行 SQL/索引 优化?MySQL 索引结构解释一下?(B+ 树)MySQL Hash 索引适用情况?举下例子?

三面

如何保证数据库与redis缓存一致的Redis 的并发竞争问题是什么?如何解决这个问题?了解 Redis 事务的 CAS 方案吗?如何保证 Redis 高并发、高可用?Redis 的主从复制原理,以及Redis 的腼腆的月亮原理?如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。MySQL数据库主从同步怎么实现?秒杀模块怎么设计的,如何压测,抗压手段

吉时已到,祝各位小伙伴在黄金九、十月份加薪的加薪,跳槽的完美跳槽,总之都拿到心愿的薪水和岗位。最后还有一些没有找到工作的小伙伴也不要着急,作者在学习java的过程中整理了一些面题 技术资料做成了这些pdf,同时有需要的也可以帮大家提供bat厂内推与互联网技术交流群。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。