MySQL的一级索引和二级索引的区别及说明

 更新时间:2025年07月05日 09:19:12   作者:快点好好学习吧  
这篇文章主要介绍了MySQL的一级索引和二级索引的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

第一部分:MySQL 的一级索引和二级索引的区别是什么?

一级索引和二级索引就像玩具工厂里的“清单”

生活中的例子

  • 想象一下,你在一家玩具工厂工作。工厂里有一个工人(相当于 MySQL)负责组装玩具:

一级索引

  • 工人有一份完整的零件清单(相当于主键索引),上面记录了每个零件的编号和具体位置。
  • 这份清单是唯一的,每个零件编号只能对应一个位置。

二级索引

  • 工人还有一份分类清单(相当于非主键索引),上面记录了零件的类别(如颜色、形状)和对应的编号。
  • 这份清单不是唯一的,一个类别可能对应多个零件编号。

在编程里

  • 一级索引(主键索引) 是基于主键构建的索引,直接指向主表中的完整数据。
  • 二级索引(非主键索引) 是基于非主键列构建的索引,存储的是主键值,需要回表才能获取完整数据。

第二部分:包含哪些部分?

主要组成部分

一级索引(主键索引)

  • 存储主键值和指向主表数据的指针。

二级索引(非主键索引)

  • 存储非主键列的值和对应的主键值。

B+ 树结构

  • 一级索引和二级索引都使用 B+ 树存储数据。

查询请求

  • 用户通过 SQL 查询请求数据。

回表操作

  • 当使用二级索引时,如果查询字段不在索引中,需要回表查找完整数据。

第三部分:背后到底做了哪些事情?

核心思想

一级索引

  • 直接定位到主表中的完整数据。

二级索引

  • 先通过索引找到主键值,再通过主键值回到主表查找完整数据。

优化策略

  • 尽量避免回表,例如使用覆盖索引。

底层实现

B+ 树索引

  • 一级索引和二级索引都使用 B+ 树存储数据。

叶子节点

  • 一级索引的叶子节点存储主键值和完整数据。
  • 二级索引的叶子节点存储非主键列的值和主键值。

查询计划

  • MySQL 的查询优化器会决定使用哪种索引。

第四部分:示例代码与详细讲解

示例代码:模拟一级索引和二级索引的工作过程

<?php

// 第一步:定义一个表
class Table {
    private $primaryKeyIndex; // 一级索引(主键索引)
    private $secondaryIndex;  // 二级索引(非主键索引)
    private $mainTable;       // 主表

    public function __construct() {
        // 初始化一级索引(主键索引)
        $this->primaryKeyIndex = [
            1 => ['id' => 1, 'name' => 'Alice', 'age' => 25, 'city' => 'New York'],
            2 => ['id' => 2, 'name' => 'Bob', 'age' => 30, 'city' => 'San Francisco'],
            3 => ['id' => 3, 'name' => 'Charlie', 'age' => 35, 'city' => 'Los Angeles']
        ];

        // 初始化二级索引(非主键索引)
        $this->secondaryIndex = [
            'Alice' => ['id' => 1],
            'Bob' => ['id' => 2],
            'Charlie' => ['id' => 3]
        ];

        // 初始化主表
        $this->mainTable = [
            1 => ['id' => 1, 'name' => 'Alice', 'age' => 25, 'city' => 'New York'],
            2 => ['id' => 2, 'name' => 'Bob', 'age' => 30, 'city' => 'San Francisco'],
            3 => ['id' => 3, 'name' => 'Charlie', 'age' => 35, 'city' => 'Los Angeles']
        ];
    }

    // 使用一级索引查找数据
    public function queryWithPrimaryKey($id) {
        echo "正在通过一级索引查找记录...\n";

        // 查找一级索引
        if (isset($this->primaryKeyIndex[$id])) {
            $record = $this->primaryKeyIndex[$id];
            echo "一级索引中找到完整记录:ID={$record['id']}, Name={$record['name']}, Age={$record['age']}, City={$record['city']}。\n";
        } else {
            echo "未找到记录。\n";
        }
    }

    // 使用二级索引查找数据
    public function queryWithSecondaryIndex($name) {
        echo "正在通过二级索引查找记录...\n";

        // 查找二级索引
        if (isset($this->secondaryIndex[$name])) {
            $indexRecord = $this->secondaryIndex[$name];
            echo "二级索引中找到主键值:ID={$indexRecord['id']}。\n";

            // 回表查找完整数据
            $mainRecord = $this->mainTable[$indexRecord['id']];
            echo "回表后找到完整记录:ID={$mainRecord['id']}, Name={$mainRecord['name']}, Age={$mainRecord['age']}, City={$mainRecord['city']}。\n";
        } else {
            echo "未找到记录。\n";
        }
    }
}

// 第二步:模拟一级索引和二级索引的工作过程
$table = new Table();

echo "\n=== 模拟一级索引查询 ===\n";

// 使用一级索引查询 ID=2 的记录
$table->queryWithPrimaryKey(2);

echo "\n=== 模拟二级索引查询 ===\n";

// 使用二级索引查询 Name='Alice' 的记录
$table->queryWithSecondaryIndex('Alice');

为什么要这样写?

  • 第一步:定义一个 Table 类,模拟一级索引和二级索引的功能。
  • 第二步:总结一级索引和二级索引的核心区别,展示其本质。

背后发生了什么?

一级索引查询

  • 直接通过主键定位到完整数据。

二级索引查询

  • 先通过索引找到主键值,再回到主表查找完整数据。

结果返回

  • 返回完整的查询结果。

总结核心作用

  • 展示一级索引和二级索引如何协作完成查询。

第五部分:使用场景

一级索引

  • 当查询条件是主键时,使用一级索引。
  • 例如:
SELECT * FROM users WHERE id=2;

二级索引

  • 当查询条件是非主键列时,使用二级索引。
  • 例如:
SELECT * FROM users WHERE name='Alice';

数据完整性需求

  • 当需要返回完整数据时,二级索引可能需要回表。
  • 例如:查询用户的所有信息。

第六部分:底层原理

B+ 树索引

一级索引

  • 叶子节点存储主键值和完整数据。

二级索引

  • 叶子节点存储非主键列的值和主键值。

回表操作

二级索引

  • 如果查询字段不在索引中,需要回到主表查找完整数据。

查询优化

覆盖索引

  • 如果查询字段都在索引中,可以避免回表。

索引设计

  • 合理设计索引,减少回表次数。

第七部分:图表与示意图

思维导图

MySQL 索引
├── 一级索引
│   ├── 主键索引
│   └── 完整数据
├── 二级索引
│   ├── 非主键索引
│   └── 回表操作
└── 查询优化
    ├── 覆盖索引
    └── 索引设计

流程图

[查询请求] --> [一级索引] --> [完整数据]
[查询请求] --> [二级索引] --> [回表操作] --> [完整数据]

架构图

[一级索引] -----> [主表] -----> [完整数据]
[二级索引] -----> [主表] -----> [完整数据]

类图

+-------------------+
|       Table       |
+-------------------+
| - primaryKeyIndex: array|
| - secondaryIndex: array |
| - mainTable: array |
+-------------------+
| + queryWithPrimaryKey(): void|
| + queryWithSecondaryIndex(): void|
+-------------------+

序列图

主程序 -> 表: 查询请求
表 -> 一级索引: 查找记录
一级索引 -> 表: 返回完整记录
表 -> 主程序: 返回查询结果

主程序 -> 表: 查询请求
表 -> 二级索引: 查找记录
二级索引 -> 表: 返回主键值
表 -> 主表: 回表查找
主表 -> 表: 返回完整记录
表 -> 主程序: 返回查询结果

数据流图

[查询请求] -----> [一级索引] -----> [完整数据]
[查询请求] -----> [二级索引] -----> [主表] -----> [完整数据]

示意图

[一级索引] -----> [主表] -----> [完整数据]
[二级索引] -----> [主表] -----> [完整数据]

第八部分:总结

一级索引和二级索引的本质

一级索引

  • 基于主键构建,直接指向主表中的完整数据。

二级索引

  • 基于非主键列构建,存储主键值,需要回表查找完整数据。

优化策略

  • 尽量避免回表,例如使用覆盖索引。

生活中的类比

一级索引和二级索引就像玩具工厂里的“清单”:

  • 一级索引是完整的零件清单,直接找到零件。
  • 二级索引是分类清单,先找到零件编号,再根据编号找到零件。

最后

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql如何查询表中的字段数量

    mysql如何查询表中的字段数量

    这篇文章主要介绍了mysql如何查询表中的字段数量问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 详细介绍windows下MySQL安装教程

    详细介绍windows下MySQL安装教程

    这篇文章主要给大家介绍的是windows下MySQL安装教程,其实好多公司,数据库的面试题都是不可避免的,甚至一些前端工程师面试的时候都避免不了被询问到和数据库有关的一些问题。下面就从最基础的安装教程开始,需要的朋友可以参考一下
    2021-11-11
  • 详解Mysql主从同步配置实战

    详解Mysql主从同步配置实战

    这篇文章主要介绍了详解Mysql主从同步实战,实例分析了Mysql主从同步的原理和实现,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • MySQL常见内存不足启动失败的完美解决方法

    MySQL常见内存不足启动失败的完美解决方法

    这篇文章主要介绍了MySQL常见内存不足启动失败的完美解决方法,需要的朋友可以参考下
    2018-03-03
  • linux下安装mysql及mysql.sock问题

    linux下安装mysql及mysql.sock问题

    最近在linux上装mysql时遇到一些棘手的问题,百思不得其解,下面小编给大家带来了linux下安装mysql及mysql.sock问题,感兴趣的朋友一起看看吧
    2018-03-03
  • Mysql主从GTID与binlog的区别及说明

    Mysql主从GTID与binlog的区别及说明

    MySQL GTID(全局事务标识符)与binlog(二进制日志)是搭建主从复制的两种机制,GTID为每个事务分配唯一标识,确保复制无数据冲突或丢失,便于复制配置和管理;binlog记录所有数据库更改,用于数据恢复和复制,GTID基于事务标识
    2024-10-10
  • mysql大小写敏感导致程序无法启动的问题

    mysql大小写敏感导致程序无法启动的问题

    这篇文章主要介绍了mysql大小写敏感导致程序无法启动的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MySQL中慢查询优化的技术指南

    MySQL中慢查询优化的技术指南

    后端开发中,数据库是系统性能瓶颈的高发地带,而慢查询往往是系统响应迟缓的罪魁祸首,本文将全面梳理慢SQL的优化思路,感兴趣的小伙伴可以了解下
    2025-06-06
  • 记一次MySQL更新语句update的踩坑

    记一次MySQL更新语句update的踩坑

    这篇文章主要介绍了记一次MySQL更新语句update的踩坑,帮助大家更好的理解和使用MySQL的更新语句,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL数据库case when then end的详细使用方法

    MySQL数据库case when then end的详细使用方法

    在SQL语法中我们首先使用CASE关键字开头,然后根据不同的条件使用WHEN关键字,并在每个条件后面指定结果,这篇文章主要给大家介绍了关于MySQL数据库case when then end的详细使用方法,需要的朋友可以参考下
    2023-12-12

最新评论