数据库

简介: 本章介绍数据库核心知识,涵盖MySQL中char与varchar的区别、事务及其ACID特性,并解析并发事务引发的脏读、不可重复读与幻读问题及隔离级别解决方案。同时讲解索引结构,重点分析B+tree特点及其优势,区分聚簇索引与二级索引,为SQL优化提供理论基础。(238字)

第四章 数据库
1、基本知识
1.1 MySQL数据库中的 char 与 varchar的区别是什么?
MySQL中的 char 和 varchar 都是用于存储字符串的数据类型,但它们在存储方式和性能上有所不同。以下是它们的主要区别:
第一点呢,就是存储方式不同:

char:定长字符串,长度是固定的,不管实际存储的字符串长度如何,都会占用固定长度的存储空间。如:char(10) 会始终占用10个字符的空间。

varchar:变长字符串,长度不固定。占用的空间与实际存储的字段长度有关。 如:varchar(10) 表示最多可以存储10个字符,如果存储的字符串长度不足10,假设为5,只会占用5个字符空间。
第二点呢,就是性能不同:

对于char,由于其固定长度,操作会快些,但是会存储浪费磁盘空间的问题。

对于varchar,由于长度可变,操作时会相对慢一点,但是可以节省磁盘空间,尤其是存储的数据长度不固定时。
所以呢,我们在设计表结构的时候,需要根据具体的场景来选择具体的数据类型。 就比如啊,如果是手机号、身份证号这样的字段,由于长度固定,我们就直接选择char类型即可,并指定长度,如:char(11)、char(18)。再比如,像用户名、备注信息这类长度不固定的,我们直接选择varchar类型,长度根据页面原型和需求文档确定。
1.2 什么是事务以及事务的四大特性?

必答内容:
事务是数据库中的基本概念,是指一组操作的集合,而这一组操作要么同时成功,要么同时失败,从而保证数据库中数据的正确性和完整性。
那事务呢,具有四大特性,也就是我们常说的ACID,分别是:原子性、一致性、隔离性、持久性。 那接下来,我就分别来聊聊这四大特性。
1). 原子性指的是事务中的这一组操作,是不可分割的最小操作单元了,操作要么全部成功,要么全部失败。
2). 一致性是指在事务操作的前后,必须使数据处于一致的状态。
3). 隔离性指的是数据库中提供了隔离机制,保证事务在不受外部并发操作的影响的独立环境中运行。
4). 持久性就比较简单了,就是事务一旦提交或回滚了,它对数据库的改变就是永久的。

可能继续发问的问题:
1). 你刚才提到了并发事务,那并发事务回引发哪些问题?
并发事务引发的问题,主要有这么几个:

脏读:就是一个事务,读取到了另一个事务还没有提交的数据。

不可重复读:指的是在同一个事务中,先后读取同一条记录,但两次读取的数据不同。

幻读:指的是一个事务按照条件查询数据时,没有对应的行,但是插入时,又发现这行数据已经存在了好像出现了幻觉。
2). 如何解决这些问题呢?
那这些问题,在数据库系统中都已经解决了。在数据库中提供了不同的隔离级别来解决这些问题, 分别有以下几种:

READ UNCOMMITED :读未提交。 这种隔离级别下,会出现脏读、不可重复读、幻读问题。

READ COMMITED:读已提交。 这种隔离级别,解决了脏读问题,但是会出现不可重复读、幻读问题。

REPEATABLE READ:可重复读。这种隔离级别,解决了脏读、不可重复读问题,但是会出现幻读问题。

SERIALIZABLE:串行化。解决了上述所有的并发事务问题。
而在MySQL数据库中,默认的隔离级别是 REPEATABLE READ(可重复读)。
3). 那为什么没有用SERIALIZABLE(串行化) 这种隔离级别呢?
其实,隔离级别,也不是越高越好。因为隔离级别高了,确实可以解决并发事务引发的问题,但是隔离级别越高,性能也越低。
2、索引基础
2.1 MySQL数据库索引的数据结构?

必答内容:
在MySQL中的索引类型有多种哈,比如像B+tree索引、Hash索引等,但在InnoDB存储引擎中默认使用的是B+tree的索引。

可能继续追问的问题:
1). B+tree索引结构的特点是什么?

B+tree呢,也叫多路平衡搜索树,也就是一个节点中可以存储多个key,多个key,也就对应多个指针,大数据量的情况下,树的高度更低。(树的阶数更多,高度更低,检索更快)。

在B+tree中,所有的数据都是存放在叶子节点的,非叶子节点,仅仅起到索引数据的作用。

而在B+tree的叶子节点中,形成了一个双向链表,便于区间范围查询。
2). 那为什么MySQL数据库的索引结构要采用B+tree?

参考 2.4
2.2 知道什么是聚簇索引,什么是二级索引吗?

必答内容:
这个还是比较清楚的,因为这个是我们在项目中进行SQL语句优化的理论基础。
聚簇索引,有时候也称为聚集索引,他的特点呢就是数据与索引存放在一块儿,B+tree的叶子节点保存了整行数据,而且在一张表中,聚簇索引有且仅有一个,默认主键索引就是聚簇索引。
二级索引,有时候也称为非聚簇索引 或 辅助索引,指的是数据和索引分开存储,B+tree的叶子节点保存对应的主键,二级索引在一张表中可以有多个。

进阶内容(细节):
那刚才提到,默认主键索引就是聚簇索引;虽然在项目开发中我们建议每一张表都必须要添加一个主键,但是从数据库本身来说,一张表是可以没有主键的,那如果没有主键,MySQL数据库会自动的选择第一个非空的唯一索引作为聚簇索引;而如果一张表既没有主键,又没有唯一索引,那这个时候MySQL数据库又会自动生成一个rowID作为聚簇索引。简单说,一张表必须有且仅有一个聚簇索引。
所以,从这个角度讲,在二级索引的叶子节点中存储的其实是对应的聚集索引的值(如果有主键,就是主键值;没有主键,有非空的唯一索引,那就是唯一索引的值;如果既没有主键,也没有非空的唯一索引,那就是自动生成的rowID的值)。

相关文章
|
1天前
|
存储 Serverless
哈希冲突
哈希冲突可通过优化哈希函数或采用冲突解决策略应对。开放寻址法通过线性、二次探查或双散列寻找空位,但易导致聚集,影响效率;链表法则在冲突位置构建链表,避免抢占,更适应动态数据,是常用方案之一。
|
1天前
|
NoSQL 索引
SSTable 的分层管理设计
SSTable分层管理通过将文件按层级组织,逐层合并,控制每层容量上限,减少多路归并规模,避免全量重叠,提升查询效率与系统性能,是LevelDB高效读写的核心设计。
|
1天前
|
存储 负载均衡 搜索推荐
大规模检索系统
本讲介绍大规模检索系统如何通过分布式技术加速检索。通过索引拆分,将倒排索引分散到多台服务器内存中,减少单机数据规模和磁盘访问,从而提升单次查询效率。结合分发服务器与负载均衡,实现高吞吐、低延迟的分布式检索架构。
|
1天前
|
存储 自然语言处理 分布式计算
索引构建
搜索引擎如何为万亿网页构建索引?通过分治与多路归并,将文档拆分为小集合,在内存中生成倒排索引后写入磁盘,再合并多个有序临时文件,最终生成全局倒排文件。词典可加载至内存或用B+树管理,实现高效检索。该过程类似MapReduce,支持分布式扩展。
|
1天前
|
存储 搜索推荐 索引
跳表法加速倒排索引
跳表、哈希表与位图法可加速倒排索引。跳表通过多层链表实现快速跳转,将归并查找时间降至O(log n);哈希表适用于小集合查大集合,查询可达O(1);位图则利用位运算高效求交集,适合短posting list场景,显著提升检索效率。
|
1天前
|
存储 算法 搜索推荐
数组的检索效率
二分查找通过将有序数组不断折半,每次比较中间值与目标值,缩小搜索范围至一半,实现O(log n)高效检索,显著优于遍历的O(n),适用于大规模有序数据查询。
|
1天前
|
存储 API 索引
数据结构的存储方式
数据结构底层存储只有数组和链表两种,其他如栈、队列、树、图等均为其衍生。数组支持随机访问但扩容困难,链表灵活增删但无法随机访问。所有数据结构的操作本质为“增删查改”,遍历方式分为线性迭代与非线性递归。理解二者差异,是掌握各类高级数据结构的基础。(238字)
|
1天前
|
存储 Java API
数组(顺序存储)基本原理
本章讲解数组的底层原理,区分静态与动态数组。通过静态数组实现动态数组的增删查改,揭示随机访问O(1)的成因与连续内存的利弊,助你理解数据结构本质。
|
1天前
|
存储 缓存 NoSQL
查找对应的 SSTable 文件
通过分层结构与二分查找快速定位SSTable,结合BloomFilter过滤和索引区加速查询。利用table cache与block cache缓存机制,减少磁盘IO,提升检索效率。整个过程高效有序,适用于大规模数据检索场景。(238字)
|
1天前
|
存储 定位技术 索引
空间检索(下)
本文探讨“查找最近的加油站”与“查找附近的人”的本质区别,前者需动态调整查询范围以获取最近K个结果。通过GeoHash编码实现高效空间检索,提出逐步扩大查询范围的策略,并利用其一维排序特性,采用统一索引结构支持多级范围查询,在减少查询次数的同时降低存储开销,提升检索效率。