mysql索引知识点详解+二叉树/红黑树/B树/B+树讲解

一、mysql数据库的文件类型

1. 数据文件

1.1 表数据文件

|------|-------------------------------------------------------|
| 文件 | 说明 |
| .frm | MySQL 5.7 及之前版本的表结构定义文件(MySQL 8.0 已废弃)。 |
| .ibd | InnoDB 独立表空间文件,存储表数据和索引(如果 innodb_file_per_table=ON)。 |
| .MYD | MyISAM 存储引擎的 数据文件。 |
| .MYI | MyISAM 存储引擎的 索引文件。 |
| .par | 用于分区表的 元数据文件。 |

1.2 表空间 文件

|---------|----------------------------------|
| 文件 | 说明 |
| ibdata1 | 共享表空间,默认存储 InnoDB 系统表、数据、事务日志 等。 |
| ibtmp1 | 临时表空间,用于存放临时表数据。 |


2. 日志文件

2.1 二进制日志 (Binlog)

  • 用途:记录数据库数据更改的 SQL 操作,用于主从复制时让从库同步数据,也能用于时间点的数据恢复。

  • 开启方法:在配置文件里添加 log-bin = mysql-bin 并重启服务。

|---------------|-----------------------------------------------------|
| 文件 | 说明 |
| binlog.000001 | 记录 数据库的变更操作(如 INSERT、UPDATE、DELETE),用于 主从复制 和 数据恢复。 |
| binlog.index | 记录所有二进制日志的索引文件。 |

2.2 错误日志(Error Log

  • 用途:记录 MySQL 启动、运行和停止时的错误、警告和提示信息,是故障排查的关键依据。

  • 特点:默认开启,可在配置文件中指定日志位置。

|-----------|--------------------------------|
| 文件 | 说明 |
| mysql.err | 记录 MySQL 启动、关闭、运行错误、警告 及 崩溃信息。 |

2.3 通用查询日志(General Log

  • 用途:记录所有客户端发送给 MySQL 的 SQL 查询,用于调试和监控客户端操作。

  • 注意事项:开启会影响性能,生产环境一般不长期开启。可在配置文件设置 general_log = 1 及日志文件路径后重启服务来开启。

|-----------|---------------------------------------------|
| 文件 | 说明 |
| mysql.log | 记录 所有 SQL 语句,用于审计。默认关闭,需 general_log=ON 启用。 |

2.4 慢查询日志(Slow Query Log

  • 用途:记录执行时间超过设定阈值的 SQL 查询,便于优化数据库性能。

  • 开启设置:在配置文件设置 slow_query_log = 1、日志文件路径及 long_query_time 阈值后重启服务。

|----------------|----------------------------------------------------|
| 文件 | 说明 |
| mysql-slow.log | 记录 执行时间超过 long_query_time(默认 10s) 的 SQL 语句,帮助优化查询。 |

2.5 中继 日志( Relay Log

  • 用途:在主从复制架构中,从库接收主库二进制日志后会将其存储为中继日志,然后从中读取并执行 SQL 语句,完成数据同步。

  • 工作机制:是从库同步数据的中间存储,可减轻主库传输压力。

|------------------|------------------------------------|
| 文件 | 说明 |
| relay-log.000001 | 从库使用的日志,存储从主库同步过来的 Binlog,用于 主从复制。 |
| relay-log.index | 记录所有中继日志的索引。 |

2.6 事务日志

|-------------------------|------------------------|
| 文件 | 说明 |
| ib_logfile0、ib_logfile1 | InnoDB 的 事务日志,用于 崩溃恢复。 |


3. 配置文件

|-----------------|----------------------------------|
| 文件 | 说明 |
| my.cnf / my.ini | MySQL 的 主配置文件,存放数据库参数,如端口、存储引擎等。 |


4. 其它临时文件

|--------------|---------------------------------------|
| 文件 | 说明 |
| #sql-xxx.frm | MySQL 运行时创建的 临时表结构文件。 |
| #sql-xxx.MYD | 临时表数据文件(MyISAM)。 |
| #sql-xxx.ibd | 临时表数据文件(InnoDB)。 |
| .pid | MySQL 进程 ID 文件,存储 MySQL 服务器的进程号(PID)。 |


二、索引管理

1. 索引的概念

索引是一种按照特定 数据结构 存储的数据,它加快了数据库的查询速度,但同时也会 影响写入性能 (因为插入或更新数据时需要维护索引)。 索引应创建在 经常作为查询条件的字段 上,以提高查询效率。

2. 索引功能、作用

2.1 索引的作用

2.2 提高查询速度

  1. 无索引:全表扫描(消耗大量资源)。

  2. 有索引:先对索引字段排序,再利用索引进行高效查找(减少 I/O)。

将经常用于查询的某些字段定义索引后,数据库利用索引定位技术,能够大大加快查询速率。但会减弱写数据的性能,因为写入的数据要重新排序特别是在当表特别大的时候,或者涉及到多表查询的时候,利用索引可以使查询加快成千倍。

2.3 降低 I/O 成本

  1. 优化数据访问 ,将随机 I/O 转为顺序 I/O,减少磁盘访问开销,降低数据库的排序成本。

  2. 加速分组与排序

    1. 使用 GROUP BYORDER BY 时,索引能大幅减少分组和排序时间

索引的缺点:占用额外空间,影响插入速度

3. 索引类型

  • 聚集索引 数据物理存储顺序与索引一致,一个表通常只有一个,利于范围查询和排序。

  • 非聚集索引 索引和数据物理顺序无关,一个表可建多个,像 "目录",查找时可能需二次定位。

区别

  • 存储: 聚集索引 叶子节点 存实际数据, 非聚集索引 存索引键值和行指针。

  • 查询: 聚集索引 适合范围查询, 非聚集索引 适合精确匹配。

  • 增删改: 聚集索引 操作可能引发大量数据移动, 非聚集索引 影响相对小。

主键 索引、辅助索引

稠密索引、稀疏索引

B+TREE 索引HASH索引 RTREE 索引

简单索引和组合索引

4. 二叉树、红黑树、B树、B+树简单实现

4.1 二叉树

  • **结构:**树状结构的基础形态,每个节点最多拥有两个子节点,分别称为左子节点和右子节点。其形状如同自然界的树,从根节点开始不断分支。

  • **特点:**查找时从根节点出发,依据数据与当前节点值的大小比较结果,决定向左或向右子节点移动,类似于在二叉决策过程中不断做出选择。但它对数据插入顺序敏感,若插入顺序不当,会导致树严重失衡,使查找效率从理想的对数级退化为线性级。

  • **应用:**常用于实现简单的搜索算法和数据结构,如在一些递归算法的演示、简单的内存数据存储场景中应用较多,不过由于其不稳定性,在大规模数据处理中较少直接使用。

4.2 红黑树

  • **结构:**在普通二叉树的基础上,为每个节点增加了颜色属性,颜色只有红色和黑色两种。这种颜色标记是其实现平衡的关键元素。

  • **特点:**通过严格的颜色规则(如根节点为黑色、红色节点的子节点为黑色等)来保证树的大致平衡。这使得红黑树在插入、删除和查找操作时,时间复杂度都能稳定在对数级别,避免了普通二叉树可能出现的性能恶化问题。

  • **应用:**广泛应用于编程语言的标准库中,例如 Java 的 TreeMap 和 TreeSet、C++ 的 STL 中的 set 和 map 等数据结构都基于红黑树实现,用于高效地存储和查找有序数据。

4.3 B 树

  • **结构:**一种多路平衡查找树,每个节点可以包含多个关键字和多个子节点(子节点数量通常大于 2)。它的结构类似于多叉的树形目录,每个节点相当于一个小的存储单元,可以容纳多个数据项。

  • **特点:**每个节点不仅存储关键字,还可能存储对应的数据,所有叶子节点位于同一层,保证了树的平衡性。这种结构使得在进行查找、插入和删除操作时,能够有效减少磁盘 I/O 次数,因为每次 I/O 操作可以读取或写入多个关键字。

  • **应用:**在文件系统和数据库系统中被广泛应用,用于实现索引结构。例如,在文件系统中,B 树可以帮助快速定位文件的存储位置;在数据库中,它可以加速数据的查询操作。

4.4 B + 树

  • **结构:**作为 B 树的变种,B + 树的非叶子节点只存储索引信息,不存储实际数据,实际数据全部存储在叶子节点中。并且所有叶子节点之间通过指针相连,形成一个有序链表。这种结构类似于多级索引表,非叶子节点是高层索引,叶子节点是最终的数据存储层。

  • **特点:**由于非叶子节点不存储数据,相同大小的磁盘页可以容纳更多的索引项,进一步减少了磁盘 I/O 次数。同时,叶子节点的链表结构使得范围查询变得非常高效,只需要在链表上进行顺序遍历即可。

  • **应用:**是数据库索引的主流实现方式,如 MySQL 的 InnoDB 存储引擎就采用 B + 树来组织索引和数据。它能够显著提高数据库的查询性能,特别是在处理范围查询和排序操作时表现出色。

5.索引组织方式(B+Tree)

左前缀索引:例如 like'abc%'

MySQL在索引时,采用左前缀索引。例如字符型 255 长度,会抽取最左侧的一部分字符来作为索引。

6.管理索引的途径

  • 创建索引

    • 创建表时指定。

    • 修改表时添加或删除:ALTER TABLE tb_name ADD/DROP INDEX index_name;

    • 单独创建:CREATE INDEX index_name ON tbl_name(col_name);(仅限普通索引)。

  • 删除索引DROP INDEX index_name ON tbl_name;

  • 查看索引SHOW INDEXES FROM tbl_name;

  • 查看可能用到的索引EXPLAIN SELECT ...;

三、mysql外键设置及定义

定义

为了满足关系型数据库的第三范式,降低数据冗余,在表与表之间需要满足相应的约束关系,可以为表和表之间设置外键

语法foreign key(col_name) references f_table(col_name)

设置外键语法 (表类型不能是myisam存储引擎)

四、视图

视图:VIEW

是一种虚表(存储下来的select语句),表结构为空。

1.创建视图:CREATE VlEW vtbl name as select statement(查询语句)

2.修改视图,#母表会变化;修改母表,视图会变化