[数据库] 数据库学习总结

906 0
Honkers 2025-8-1 11:06:37 来自手机 | 显示全部楼层 |阅读模式

目录

引言

1 数据库管理系统 database

1.1 数据库概述

1.1.1 存储

1.1.2 数据库管理系统 DBMS

1.1.3 数据库管理系统分类

1.2 MySQL 核心操作

1.2.1 MySQL 命令(特有)

1.2.2 MySQL 服务

1.3 数据对象

1.4 表

2 SQL

2.1  数据库的数据类型

2.2 DDL 示例

2.3 DML 数据库操作语言

2.4 上传文件

2.4.1 mysql 导入 hr.sql

2.5 sql 查询

2.6 表连接

3 函数与子查询

4 函数和事务处理

4.1 函数

4.2 事务处理

4.2.1 事务

4.3 交集、并集、差集

4.4 事物操作

4.5 死锁

5 MySQL

5.1 安装客户端库

5.2 创建用户

5.3 MySQL API

5.4 索引

5.5 数据库备份与恢复

5.6 数据库调优

6 总结


引言

数据库索引是提升查询性能的关键技术之一,大多数现代数据库系统(如MySQL、Oracle、PostgreSQL等)的核心索引结构基于B+树实现。B+树通过其平衡的多层树形结构和有序的叶子节点链表,高效支持范围查询、等值查询及排序操作,同时减少了磁盘I/O次数。相比哈希索引的单一键值查找或B树的分散数据存储,B+树在范围扫描和顺序访问场景中表现更优,成为关系型数据库索引的主流选择。其设计权衡了查询效率、插入删除性能及存储开销,是数据库系统中平衡读写性能的重要基石。

1 数据库管理系统 database

1.1 数据库概述

1.1.1 存储

- 文件系统:FILE fopen fclose, 少量数据、配置信息

- 数据库管理系统:结构化、大量的数据

1.1.2 数据库管理系统 DBMS

是一套软件,用于创建、操作、管理 `数据库`

数据库:磁盘上的一组文件,包含:数据文件、日志文件、控制文件

数据库实例:由后台进程、内存结构、数据库构成

一个数据库,可以启动多个实例(集群),一个实例对应一个数据库,数据库实例是操作数据库的方式

1.1.3 数据库管理系统分类

- 关系型数据库:基于关系模型、使用SQL操作数据、传统的数据存储方式

    - 商业产品

        - Oracle #1

        - Db2 IBM #2

        - SQL Server

    - 开源产品

        - PostgreSQL    最先进的 C      

        - MySQL         最受欢迎 C++    #1

        - SQLite        嵌入式数据库

        - 国产的数据库产品:

- NoSQL:Not Only SQL,是在特定场景替代 关系数据库

    - 文档数据库:mongoDB 可以部分替代关系数据库

    - 键值数据库:redis 缓存、数据结构存储和运算

    - 列数据库:clickhouse/hbase 大数据场景的数据存储、

    - 图数据库:neo2j 数据结构图相关的操作与算法

1.2 MySQL 核心操作

1.2.1 MySQL 命令(特有)

1. 连接服务器

  1. mysql
  2. mysql -u用户名 -p密码 -h主机名127.0.0.1 -P端口号3306
复制代码

2. 显示基本信息

  1. \s 服务器状态信息
  2. \h 帮助信息
复制代码

3. 显示数据库

  1. show databases;
复制代码

4. 连接数据库

  1. use 数据库名;
复制代码

5. 显示表

  1. show tables;
复制代码

6. 显示表结构

  1. desc 表名称;
  2. 显示表中的数据
  3. select * from 表名称;
复制代码

7. 创建数据库

  1. create database xyz;
复制代码
1.2.2 MySQL 服务

0. 查找服务是否存在

  1. ps -ef | grep mysql
  2. service mysql status
  3. service mysql start
复制代码

1. 安装服务

  1. sudo apt update
  2. sudo apt upgrade
  3. sudo apt install mysql-server
复制代码

1.3 数据对象

- 表:数据存储在表中,表由行和列构成的二维存储结构

- 索引:占空间,为提升搜索的速度

- 视图:虚拟的表,是查询语句,不占用存储空间

- 函数:

- 过程:存储过程,命名的 SQL 代码块,需要调用才执行

- 触发器:特殊的过程,在特定的时间或事件发生时自动执行

- 包:一个命名空间,把相关的数据对象封装起来

1.4 表

列:由多个‘字段’构成,每个字段存储单一的数据项,列的先后顺序对表没有影响

行:记录,一个表中不能存在完全相同的两行,行的顺序对表没有影响

主键:primary key 表中一列或多列组合起来唯一标识表中的一条记录

主键的选取:

- 业务主键:使用业务中有实际意义的一个字段做主键;身份证、手机号、学号、车牌号

- 代理主键:使用一个无意义的数值;自增长的序列、UUID

外键:foreign key ,用于连接另一张表,是连接表中的主键或唯一键

外键约束,数据的一致性。

关系范式:一套约束、确保表格式的设计符合关系模型

- 1NF:列的值是单一的数据项,不可拆分

- 2NF:主键依赖,表中的非键字段都直接依赖于主键

- 3NF:非键字段之间不存在依赖关系

意义:

- 降低数据冗余(一些数据,只存一次,而非存储多次)

- 完整性

- 一致性


反范式:满足了范式后,基于业务、性能的需求去打破或违反范式

- 业务

- 性能

2 SQL

- DDL       数据定义语言

- DML       数据操作语言

- TCL       事物控制语言

DDL 创建、修改、删除数据对象(表、视图、索引 ...)

- 'CREATE'              创建

- 'ALTER'               修改

- 'DROP'                删除

- 'TRUNCATE'            截断

- 'GRANT'               授权

DML 数据操作语言(CRUD CreateReadUpdateDelete 增删改查)

- INSERT                插入

- SELECT                查找

- UPDATE                更新

- DELETE                删除

TCL 事物控制语句 *

- BEGIN             开始

- COMMIT            提交

- ROLLBACK          回滚

  1.     -- 创建数据库
  2.     create database 数据库名称;
  3.     use 数据库名称;
  4.     -- 创建表
  5.     CREATE TABLE order
  6.     (
  7.         'id'        INT PRIMARY KEY,
  8.         'name'  VARCHAR(16),
  9.         'tel'       CHAR(11),
  10.         ''
  11.     );
复制代码

2.1  数据库的数据类型

- 数值

    - bit

    - tinyint       1

    - smallint      2

    - int           4   *

    - bigint        8

    - decimal           *

    - double

- 字符串(文本)

    - CHAR          固定

    - VARCHAR       可变长度  n+1

    - BINARY            二进制

    - BLOB          大二进制对象

    - TEXT          比较长的字符串

    - LONGTEXT  

    - ENUM          枚举

    - SET           集合

- 日期与时间

    - DATE

    - TIME

    - DATETIME

    - timestamp     时间戳,精度高,秒之后六位

    - YEAR

- JSON(非关系型数据库范畴,文档数据库的核心)

    - 数组 []

    - 对象 {}

- 空间数据

  1.     CREATE TABLE staff
  2.     (
  3.         id          INT PRIMARY KEY AUTO_INCREMENT,
  4.         name        VARCHAR(16) NOT NULL,
  5.         gender      ENUM('M', 'F') DEFAULT 'M',
  6.         tel         CHAR(11),
  7.         birthday        DATE DEFAULT '2000-1-1'
  8.     );
复制代码

2.2 DDL 示例

  1.     create table tb1
  2.     (
  3.         id int primary key auto_increment,
  4.         info1 char(6) not null,
  5.         info2 char(6),
  6.         time datetime default now()
  7.     );
  8.     desc tb1;       查看表
  9.     insert into tb1 values(1, 'info 1', 'info 2', '2025-5-28');
  10.     insert into tb1(info1) values('hello');
  11.     select * from tb1;
  12.     select id, info1, info2, time from tb1;
  13.     -- 投影
  14.     select id, info1, 1+2 from tb1;
  15.     -- 修改表结构
  16.     alter table tb1 add age int;
  17.     alter table tb1 add tel char(11) default '10086';
  18.     alter table tb1 drop age;
  19.     alter table tb1 change tel phone char(14);
  20.     delete from tb1 where id=9;
  21.     -- 备份一张表,包括了结构与数据
  22.     create table tb2
  23.     select * from tb1;
  24.     -- 创建一张空表
  25.     create table tb3
  26.     select * from tb1 where 1>2;
  27.     create table tb4
  28.     select id, info1 from tb1;
  29.     -- 删除表:结构和数据
  30.     drop table tb1;
  31.     -- 删除表中的一行或多行数据
  32.     delete from tb1;
  33.     delete form tb1 where id=2;
  34.     -- 截断:删除数据,保留表结构,先drop再create(会释放空间,自动增长从头开始)
  35.     truncate table tb2;
  36.     -- 更新
  37.     update tb1 set info2='x1', time='1999-2-2', info1='aaa' where id=1;
  38.     -- 导入 SQL 脚本
  39.     source /opt/data.sql
复制代码


 

2.3 DML 数据库操作语言

- 'INSERT'

- 'SELECT'  *

- 'UPDATE'

- 'DELETE'

  1.     -- 投影
  2.         select
  3.             col1,
  4.             col2 as col_xxx,
  5.             col3 nick
  6.         from
  7.             tb1
  8.         (LEFT | RIGHT | FULL) JOIN
  9.             tb2;
  10.         ON
  11.             tb1.pk = tb2.pk
  12.         WHERE
  13.             col1 > 42
  14.         GROUP BY
  15.             col2
  16.         HAVING
  17.             col < 3
  18.         ORDER BY
  19.             col1, col2 DESC
  20.         LIMIT
  21.             5
  22.         OFFSET
  23.             100;
复制代码

2.4 上传文件

ssh 安全 shell

scp 安全 copy

scp 源 目标(root@地址ip:路径)

2.4.1 mysql 导入 hr.sql
  1. source /home/jkh/mysql/hr.sql
复制代码

2.5 sql 查询

  1.     -- 查询员工的编号,姓名,工资
  2.     select id,name,salary
  3.     from staff
  4.    
  5.     -- 按照工资降序排列
  6.     order by salary desc
  7.     -- 只要前三个
  8.     limit 3;
  9.     -- 查询 2000 年以后出生的员工信息,编号、姓名、生日、工资
  10.     select id,name,birth,salary
  11.     from staff
  12.     where birth >= '1990-01-01' and birth < '2000-01-01';
  13.     (where birth between '1990-01-01' and '2000-01-01';)
  14.     -- 工资在 5000-10000;
  15.     where salary between 5000 and 10000;
  16.     -- 查询2000年以后出生的员工,编号、姓名、生日、工资,按照工资降序排列,只要前三
  17.     select id,name,birth,salary
  18.     from staff
  19.     where birth >= '2000-01-01'
  20.     order by salary desc
  21.     limit 3;
复制代码

2.6 表连接

- 笛卡尔乘积

- 内连接(等值连接)

- 外连接

    - 左外连接

    - 右外连接

    - 全连接

  1.     -- 笛卡尔乘积
  2.     select * from staff,dept;
  3.     -- 内连接(两张表中的交集部分)
  4.     select
  5.         *
  6.     from
  7.         staff
  8.     inner join
  9.         dept
  10.     on
  11.         staff.dept_id = dept.id;
  12.    
  13.     select
  14.         *
  15.     from
  16.         staff,dept
  17.     where
  18.         staff.dept_id = dept.id;
  19.     -- 左外连接
  20.     select
  21.         *
  22.     from
  23.         staff s
  24.     left join
  25.         dept d
  26.     on
  27.         s.dept_id = d.id;
  28.     -- 右外连接
  29.     select
  30.         *
  31.     from
  32.         staff s
  33.     right join
  34.         dept d
  35.     on
  36.         s.dept_id = d.id;
  37.     -- 查询各个员工的编号、姓名、部门及工作地点
  38.     select
  39.         s.id,s.name,d.name dept,city
  40.     from
  41.         staff s
  42.     left join
  43.         dept d
  44.     on
  45.         s.dept_id = d.id;
  46.    
  47.     -- 查询员工的编号、姓名、老板的名字
  48.     select
  49.         s.id,s.name,b.name
  50.     from
  51.         staff s
  52.     left join
  53.         staff b
  54.     on
  55.         s.mgr = b.id;
复制代码

3 函数与子查询

函数

- 内置函数

- 自定义函数

分类

- 多行(聚合)函数

    - `max`

    - `min`

    - `avg`

    - `sum`

    - `count`

- 单行函数

    - 数值

    - 字符串

    - 时间和日期

    - 其他

  1.     --
  2.     select
  3.         min(salary),max(salary),avg(salary),sum(salary),count(salary),
  4.         sum(salary)/count(salary) avg
  5.     from
  6.         staff;
  7.     select
  8.         gender,
  9.         min(salary),
  10.         max(salary),
  11.         avg(salary),
  12.         count(gender)
  13.     from
  14.         staff
  15.     group by
  16.         gender;
  17.     select
  18.         level,
  19.         min(salary),
  20.         max(salary),
  21.         avg(salary),
  22.         count(id) n
  23.     from
  24.         staff
  25.     group by
  26.         level
  27.     having
  28.         n > 1;
  29.     select
  30.         count(id)
  31.     from
  32.         staff;
  33.     select
  34.         d.name dept,
  35.         min(s.salary) sal
  36.     from
  37.         staff s
  38.     right join
  39.         dept d
  40.     on
  41.         s.dept_id = d.id
  42.     group by
  43.         d.name
  44.     order by
  45.         min(s.salary);
  46.     select distinct gender from staff;
  47.     -- 各个部门有多少员工,部门编号、部门名称、员工人数
  48.     select
  49.         d.id,
  50.         d.name,
  51.         count(s.id)
  52.     from
  53.         staff s
  54.     right join
  55.         dept d
  56.     on
  57.         s.dept_id = d.id
  58.     group by
  59.         d.id, d.name;
  60.     -- 各个城市有多少个员工
  61.     select
  62.         d.city city,
  63.         count(s.id) n,
  64.         avg(salary) sal
  65.     from
  66.         staff s
  67.     right join
  68.         dept d
  69.     on
  70.         s.dept_id = d.id
  71.     group by
  72.         city
  73.     order by
  74.         n desc;
  75.    
  76.     select
  77.         m.id,
  78.         m.name,
  79.         count(s.id)
  80.     from
  81.         staff s
  82.     left join
  83.         staff m
  84.     on
  85.         s.mgr = m.id
  86.     where
  87.         m.id is not null
  88.     group by
  89.         m.id;
  90.    
  91.     -- 工资大于平均工资的员工
  92.     select
  93.         *
  94.     from
  95.         staff
  96.     where
  97.         salary > (
  98.             select
  99.                 avg(salary)
  100.             from
  101.                 staff
  102.         );
  103.     -- 获得与 jack 同一个部门的员工
  104.     select
  105.         *
  106.     from
  107.         staff
  108.     where
  109.         dept_id = (
  110.             select
  111.                 dept_id
  112.             from
  113.                 staff
  114.             where
  115.                 name = 'jack'
  116.         );
复制代码

4 函数和事务处理

4.1 函数

- 聚合函数 group by having

    - max

    - min

    - avg

    - sum

    - count

- 单行函数

    - 数值            : round,floor,ceiling,abs,pow

    - 字符串       : concat,trim,ltrim,rtrim,left,right,mid,char_length,replace,lower,upper,md5,sha1,sha2

    - 日期和时间  : now,sysdate,curdate,curtime,timestamp,adddate,datediff,timediff,date_format

    - json          

4.2 事务处理

4.2.1 事务

一个业务操作包含多个数据操作,多个数据操作构成一个事物

特性

- A     原子性: 构成一个事物的多个数据操作是一个整体,不可切分,执行的结果要么都成功(提交),要么都撤销(回滚)

- C     一致性: 事物执行前后,数据状态总体一致

- I     隔离性: 多个事物相互隔离,不能交织执行

- D     持久性: 事物结束,数据写入磁盘

隔离级别            脏读          不可重复读           幻读

- 读未提交           +                  +              +

- 读已提交           -                  +              +

- 不可重复读      -                  -              +        *

- 串行化           -                   -              -

  1.     -- 账户
  2.     create database bank;
  3.     use bank;
  4.     create table account
  5.     (
  6.         `id`            int primary key auto_increment,
  7.         `name`          varchar(16),
  8.         `balance`       decimal(9,2)
  9.     );
  10.     insert into account values(1,"alice",10000);
  11.     insert into account values(2,"bob",10000);
  12.     insert into account values(3,"jack",10000),(4,"rose",10000);
  13.     -- 保存交易记录
  14.     create table log
  15.     (
  16.         `id`            int primary key auto_increment,
  17.         `from`          int,
  18.         `to`            int,
  19.         `amount`        decimal(9,2),
  20.         `time`          datetime default now()
  21.     );
复制代码

ifnull(将null替换为其他值)(再SQL中任何数+null都为null)

  1.     select
  2.         name,ifnull(salary,0)+ifnull(bonus,0) income
  3.     from
  4.         staff;
  5.    
  6.     select
  7.         name, bonus
  8.     from
  9.         staff
  10.     where
  11.         bonus is null;
  12.     select
  13.         name, bonus
  14.     from
  15.         staff
  16.     where
  17.         bonus is not null;
  18.     -- in, not in
  19.     select
  20.         name,dept_id
  21.     from
  22.         staff
  23.     where
  24.         dept_id in (1,2,3);
  25.         -- dept_id not in (1,2,3);
  26.         -- dept_id = 1 or dept_id = 2 or dept_id = 3;
  27.    
  28.     select
  29.         avg(salary),
  30.         round(avg(salary),2),
  31.         floor(avg(salary)),
  32.         ceiling(avg(salary))
  33.     from
  34.         staff;
  35.     select
  36.         3*7,
  37.         abs(-9),
  38.         pow(2,3)
  39.     from
  40.         dual;
  41.     select
  42.         name,
  43.         level,
  44.         concat(name," is ",level)
  45.     from
  46.         staff;
  47.     select
  48.         quote('  hello  '),
  49.         quote(ltrim('  hello  ')),
  50.         quote(rtrim('  hello  ')),
  51.         quote(trim('  hello  '))
  52.     from
  53.         dual;
  54.     select
  55.         name,
  56.         left(name,1),
  57.         mid(name,2,5),
  58.         right(name,3)
  59.     from
  60.         staff;
  61.    
  62.     select
  63.         name,
  64.         char_length(name)
  65.     from
  66.         staff;
  67.     select
  68.         name,
  69.         sha2(name,256)
  70.     from
  71.         staff;
  72.     -- 时间与日期
  73.     select
  74.         now(),
  75.         curdate(),
  76.         curtime(),
  77.         sysdate()
  78.     from
  79.         dual;
  80.    
  81.     select
  82.         adddate(curdate(), 100),
  83.         datediff(curdate(), '2000-1-1'),
  84.         datediff(curdate(), '2025-12-31')
  85.     from
  86.         dual;
  87.     select
  88.         curtime(),
  89.         timediff(curtime(), '12:06')
  90.     from
  91.         dual;
  92.     select
  93.         birth,
  94.         date_format(birth, '%m/%d')
  95.     from
  96.         staff
  97.     where
  98.         date_format(birth, '%m') = '02';
  99.     -- like 模糊查询
  100.     -- _ 一个字符
  101.     -- % 任意字符
  102.     select
  103.         name
  104.     from
  105.         staff
  106.     where
  107.         name like '%a%';
复制代码

4.3 交集、并集、差集

  1.     create table t1(
  2.         id int,
  3.         info char(4)
  4.     );
  5.     insert into t1 values(1, 'a');
  6.     insert into t1 values(2, 'b');
  7.     insert into t1 values(3, 'c');
  8.     insert into t1 values(4, 'd');
  9.     create table t2(
  10.         id int,
  11.         info char(4)
  12.     );
  13.     insert into t2 values(1, 'c');
  14.     insert into t2 values(2, 'd');
  15.     insert into t2 values(3, 'e');
  16.     insert into t2 values(4, 'f');
  17.     -- 交集
  18.     select
  19.         t1.info
  20.     from
  21.         t1
  22.     inner join
  23.         t2
  24.     where
  25.         t1.info = t2.info;
  26.     -- 并集 加 all 相同值会重复出现
  27.     select
  28.         info
  29.     from
  30.         t1
  31.     union all
  32.     select
  33.         info
  34.     from
  35.         t2;
  36.     --  差集
  37.     -- 性能差
  38.     select
  39.         info
  40.     from
  41.         t1
  42.     where
  43.         info
  44.     not in(
  45.         select
  46.             info
  47.         from
  48.             t2
  49.     );
  50.     -- 推荐外连接再过滤
  51.     select t1.info
  52.     from t1
  53.     left join t2
  54.     on t1.info = t2.info
  55.     where t2.id is null;
复制代码

4.4 事物操作

默认为自动事物

手动事物: 

- begin

- rollback

- commit

  1.     -- 1号给2号 1000 元
  2.     begin;
  3.         update account set balance = balance - 1000 where id = 1;
  4.         update account set balance = balance + 1000 where id = 2;
  5.         insert into log(`from`, `to`, `amount`) values(1,2,1000);
  6.     commit;
复制代码

4.5 死锁

  1.     -- 事物1
  2.     begin;
  3.         update account set balance = balance - 1000 where id = 1;       -- 1
  4.         update account set balance = balance + 1000 where id = 2;       -- 3
  5.     commit;
  6.     -- 事物2
  7.     begin;
  8.         update account set balance = balance - 10 where id = 2;         -- 2
  9.         update account set balance = balance + 100 where id = 1;        -- 4
  10.     commit;
复制代码

5 MySQL

MySQL           C++

PostgreSQL      C

SQLite          C

数据库的**连接器**或**客户端**: C/C++, Python, Java, Go

5.1 安装客户端库

  1. sudo apt-get install libmysqlclient-dev
  2. 安装头文件和库文件
  3. /usr/include/mysql
  4. /usr/lib/mysql
  5. 编译指令
  6. gcc my.c -o my -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
  7. 替代方案: makefile
复制代码

5.2 创建用户

  1. sudo mysql
  2. create user jkh@'%' identified by 'jkh';
  3. 授权 root 访问数据库 bank 中所有的数据对象
  4. grank all on bank.* to root@'%'
复制代码

5.3 MySQL API

结构体

- MySQL             数据库连接,

- MySQL_RES         result 结果集, 查询返回的多行数据构成的内存结构

- MySQL_ROW         一行记录,字符串数组,row[0],row[1],row[n-1]

- MySQL_ROWS        由 MYSQL_ROW 构成的链表

函数

- `mysql_init`              初始化数据库连接,没有连接

- `mysql_close`             释放数据库连接

- `mysql_error`             显示错误信息,字符串显示

- `mysql_real_connect`      建立数据库连接,TCP

- `mysql_query`             执行SQL语句: insert,update,delete,select

- `mysql_store_result`      加载select结果集, 使用缓存,

- `mysql_use_result`        加载select结果集

- `mysql_free_result`       释放结果集

- `mysql_num_rows`          结果集中的元数据:行数

- `mysql_num_fields`        结果集中的元数据:列数

- `mysql_fetch_row`         从结果集获得一行数据

- `mysql_insert_id`         获得插入记录的自动生成的id

5.4 索引

没有索引,默认全表扫描,性能比较差

- 主键字段自动创建索引

- where 过滤条件中的字段可以手动创建索引

优点:提升搜索的速度

缺点:占存储空间,在插入数据和删除数据后索引会重建,性能有损耗

具体实现:B+ 树

B树:分支节点和叶子节点中都存储了数据

B+树:叶子节点存储数据,叶子节点使用双向链表连接了起来

5.5 数据库备份与恢复

备份:导出

  1. mysqldump -u root -p --databases hr > d:\hr.sql
复制代码

恢复:导入

  1. mysql > source d:\hr.sql
复制代码

Oracle/DB2

- exp 导出

- imp 导入

5.6 数据库调优

- SQL优化:不使用 select * ,使用 join 替代子查询,不使用 IN \ NOT IN ,使用执行计划分析 SQL 语句的性能

- 索引,提升到原有的 1/10

- 分表:垂直分表(业务:),水平分表

    - range

    - list

    - hash

- 分库:分布式的主从 Master/Worker 结构、做读/写分离

- 缓存:使用 redis 做缓存

  1. -- 窗口函数
  2. -- row_number()
  3. -- union
  4. select id,name,salary,
  5. row_number() over(order by salary desc)
  6. from staff;
  7. select id,name,salary,
  8. dense_rank() over(order by salary desc)
  9. from staff;
  10. create view v_staff
  11. as
  12. select id,name,salary,dept_id,
  13. row_number() over(partition by dept_id order by salary desc) n
  14. from staff;
  15. select count(id) from dept
  16. union all
  17. select count(id) from staff;
复制代码

6 总结

总结来说,B+树因其高效的查询性能、优秀的范围查询支持以及较低的磁盘I/O开销,成为大多数数据库系统索引的首选数据结构。相较于哈希索引和B树,B+树在保持数据有序性的同时,通过多路平衡和叶子节点链表优化了顺序访问和范围扫描,使其特别适合数据库的大规模数据存储和高并发访问需求。尽管索引会占用额外存储空间并可能影响写入性能,但其在加速数据检索方面的优势使其成为现代数据库不可或缺的核心技术之一。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行