Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL一级索引和二级索引的区别

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

作者:快点好好学习吧

这篇文章主要介绍了MySQL的一级索引和二级索引的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

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

生活中的例子

一级索引

二级索引

在编程里

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

主要组成部分

一级索引(主键索引)

二级索引(非主键索引)

B+ 树结构

查询请求

回表操作

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

核心思想

一级索引

二级索引

优化策略

底层实现

B+ 树索引

叶子节点

查询计划

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

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

<?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');

为什么要这样写?

背后发生了什么?

一级索引查询

二级索引查询

结果返回

总结核心作用

第五部分:使用场景

一级索引

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|
+-------------------+

序列图

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

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

数据流图

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

示意图

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

第八部分:总结

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

一级索引

二级索引

优化策略

生活中的类比

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

最后

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

您可能感兴趣的文章:
阅读全文