欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL的一級(jí)索引和二級(jí)索引的區(qū)別及說(shuō)明

 更新時(shí)間:2025年07月05日 09:19:12   作者:快點(diǎn)好好學(xué)習(xí)吧  
這篇文章主要介紹了MySQL的一級(jí)索引和二級(jí)索引的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

第一部分:MySQL 的一級(jí)索引和二級(jí)索引的區(qū)別是什么?

一級(jí)索引和二級(jí)索引就像玩具工廠里的“清單”

生活中的例子

  • 想象一下,你在一家玩具工廠工作。工廠里有一個(gè)工人(相當(dāng)于 MySQL)負(fù)責(zé)組裝玩具:

一級(jí)索引

  • 工人有一份完整的零件清單(相當(dāng)于主鍵索引),上面記錄了每個(gè)零件的編號(hào)和具體位置。
  • 這份清單是唯一的,每個(gè)零件編號(hào)只能對(duì)應(yīng)一個(gè)位置。

二級(jí)索引

  • 工人還有一份分類清單(相當(dāng)于非主鍵索引),上面記錄了零件的類別(如顏色、形狀)和對(duì)應(yīng)的編號(hào)。
  • 這份清單不是唯一的,一個(gè)類別可能對(duì)應(yīng)多個(gè)零件編號(hào)。

在編程里

  • 一級(jí)索引(主鍵索引) 是基于主鍵構(gòu)建的索引,直接指向主表中的完整數(shù)據(jù)。
  • 二級(jí)索引(非主鍵索引) 是基于非主鍵列構(gòu)建的索引,存儲(chǔ)的是主鍵值,需要回表才能獲取完整數(shù)據(jù)。

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

主要組成部分

一級(jí)索引(主鍵索引)

  • 存儲(chǔ)主鍵值和指向主表數(shù)據(jù)的指針。

二級(jí)索引(非主鍵索引)

  • 存儲(chǔ)非主鍵列的值和對(duì)應(yīng)的主鍵值。

B+ 樹(shù)結(jié)構(gòu)

  • 一級(jí)索引和二級(jí)索引都使用 B+ 樹(shù)存儲(chǔ)數(shù)據(jù)。

查詢請(qǐng)求

  • 用戶通過(guò) SQL 查詢請(qǐng)求數(shù)據(jù)。

回表操作

  • 當(dāng)使用二級(jí)索引時(shí),如果查詢字段不在索引中,需要回表查找完整數(shù)據(jù)。

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

核心思想

一級(jí)索引

  • 直接定位到主表中的完整數(shù)據(jù)。

二級(jí)索引

  • 先通過(guò)索引找到主鍵值,再通過(guò)主鍵值回到主表查找完整數(shù)據(jù)。

優(yōu)化策略

  • 盡量避免回表,例如使用覆蓋索引。

底層實(shí)現(xiàn)

B+ 樹(shù)索引

  • 一級(jí)索引和二級(jí)索引都使用 B+ 樹(shù)存儲(chǔ)數(shù)據(jù)。

葉子節(jié)點(diǎn)

  • 一級(jí)索引的葉子節(jié)點(diǎn)存儲(chǔ)主鍵值和完整數(shù)據(jù)。
  • 二級(jí)索引的葉子節(jié)點(diǎn)存儲(chǔ)非主鍵列的值和主鍵值。

查詢計(jì)劃

  • MySQL 的查詢優(yōu)化器會(huì)決定使用哪種索引。

第四部分:示例代碼與詳細(xì)講解

示例代碼:模擬一級(jí)索引和二級(jí)索引的工作過(guò)程

<?php

// 第一步:定義一個(gè)表
class Table {
    private $primaryKeyIndex; // 一級(jí)索引(主鍵索引)
    private $secondaryIndex;  // 二級(jí)索引(非主鍵索引)
    private $mainTable;       // 主表

    public function __construct() {
        // 初始化一級(jí)索引(主鍵索引)
        $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']
        ];

        // 初始化二級(jí)索引(非主鍵索引)
        $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']
        ];
    }

    // 使用一級(jí)索引查找數(shù)據(jù)
    public function queryWithPrimaryKey($id) {
        echo "正在通過(guò)一級(jí)索引查找記錄...\n";

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

    // 使用二級(jí)索引查找數(shù)據(jù)
    public function queryWithSecondaryIndex($name) {
        echo "正在通過(guò)二級(jí)索引查找記錄...\n";

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

            // 回表查找完整數(shù)據(jù)
            $mainRecord = $this->mainTable[$indexRecord['id']];
            echo "回表后找到完整記錄:ID={$mainRecord['id']}, Name={$mainRecord['name']}, Age={$mainRecord['age']}, City={$mainRecord['city']}。\n";
        } else {
            echo "未找到記錄。\n";
        }
    }
}

// 第二步:模擬一級(jí)索引和二級(jí)索引的工作過(guò)程
$table = new Table();

echo "\n=== 模擬一級(jí)索引查詢 ===\n";

// 使用一級(jí)索引查詢 ID=2 的記錄
$table->queryWithPrimaryKey(2);

echo "\n=== 模擬二級(jí)索引查詢 ===\n";

// 使用二級(jí)索引查詢 Name='Alice' 的記錄
$table->queryWithSecondaryIndex('Alice');

為什么要這樣寫?

  • 第一步:定義一個(gè) Table 類,模擬一級(jí)索引和二級(jí)索引的功能。
  • 第二步:總結(jié)一級(jí)索引和二級(jí)索引的核心區(qū)別,展示其本質(zhì)。

背后發(fā)生了什么?

一級(jí)索引查詢

  • 直接通過(guò)主鍵定位到完整數(shù)據(jù)。

二級(jí)索引查詢

  • 先通過(guò)索引找到主鍵值,再回到主表查找完整數(shù)據(jù)。

結(jié)果返回

  • 返回完整的查詢結(jié)果。

總結(jié)核心作用

  • 展示一級(jí)索引和二級(jí)索引如何協(xié)作完成查詢。

第五部分:使用場(chǎng)景

一級(jí)索引

  • 當(dāng)查詢條件是主鍵時(shí),使用一級(jí)索引。
  • 例如:
SELECT * FROM users WHERE id=2;

二級(jí)索引

  • 當(dāng)查詢條件是非主鍵列時(shí),使用二級(jí)索引。
  • 例如:
SELECT * FROM users WHERE name='Alice';

數(shù)據(jù)完整性需求

  • 當(dāng)需要返回完整數(shù)據(jù)時(shí),二級(jí)索引可能需要回表。
  • 例如:查詢用戶的所有信息。

第六部分:底層原理

B+ 樹(shù)索引

一級(jí)索引

  • 葉子節(jié)點(diǎn)存儲(chǔ)主鍵值和完整數(shù)據(jù)。

二級(jí)索引

  • 葉子節(jié)點(diǎn)存儲(chǔ)非主鍵列的值和主鍵值。

回表操作

二級(jí)索引

  • 如果查詢字段不在索引中,需要回到主表查找完整數(shù)據(jù)。

查詢優(yōu)化

覆蓋索引

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

索引設(shè)計(jì)

  • 合理設(shè)計(jì)索引,減少回表次數(shù)。

第七部分:圖表與示意圖

思維導(dǎo)圖

MySQL 索引
├── 一級(jí)索引
│   ├── 主鍵索引
│   └── 完整數(shù)據(jù)
├── 二級(jí)索引
│   ├── 非主鍵索引
│   └── 回表操作
└── 查詢優(yōu)化
    ├── 覆蓋索引
    └── 索引設(shè)計(jì)

流程圖

[查詢請(qǐng)求] --> [一級(jí)索引] --> [完整數(shù)據(jù)]
[查詢請(qǐng)求] --> [二級(jí)索引] --> [回表操作] --> [完整數(shù)據(jù)]

架構(gòu)圖

[一級(jí)索引] -----> [主表] -----> [完整數(shù)據(jù)]
[二級(jí)索引] -----> [主表] -----> [完整數(shù)據(jù)]

類圖

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

序列圖

主程序 -> 表: 查詢請(qǐng)求
表 -> 一級(jí)索引: 查找記錄
一級(jí)索引 -> 表: 返回完整記錄
表 -> 主程序: 返回查詢結(jié)果

主程序 -> 表: 查詢請(qǐng)求
表 -> 二級(jí)索引: 查找記錄
二級(jí)索引 -> 表: 返回主鍵值
表 -> 主表: 回表查找
主表 -> 表: 返回完整記錄
表 -> 主程序: 返回查詢結(jié)果

數(shù)據(jù)流圖

[查詢請(qǐng)求] -----> [一級(jí)索引] -----> [完整數(shù)據(jù)]
[查詢請(qǐng)求] -----> [二級(jí)索引] -----> [主表] -----> [完整數(shù)據(jù)]

示意圖

[一級(jí)索引] -----> [主表] -----> [完整數(shù)據(jù)]
[二級(jí)索引] -----> [主表] -----> [完整數(shù)據(jù)]

第八部分:總結(jié)

一級(jí)索引和二級(jí)索引的本質(zhì)

一級(jí)索引

  • 基于主鍵構(gòu)建,直接指向主表中的完整數(shù)據(jù)。

二級(jí)索引

  • 基于非主鍵列構(gòu)建,存儲(chǔ)主鍵值,需要回表查找完整數(shù)據(jù)。

優(yōu)化策略

  • 盡量避免回表,例如使用覆蓋索引。

生活中的類比

一級(jí)索引和二級(jí)索引就像玩具工廠里的“清單”:

  • 一級(jí)索引是完整的零件清單,直接找到零件。
  • 二級(jí)索引是分類清單,先找到零件編號(hào),再根據(jù)編號(hào)找到零件。

最后

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql如何查詢表中的字段數(shù)量

    mysql如何查詢表中的字段數(shù)量

    這篇文章主要介紹了mysql如何查詢表中的字段數(shù)量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳細(xì)介紹windows下MySQL安裝教程

    詳細(xì)介紹windows下MySQL安裝教程

    這篇文章主要給大家介紹的是windows下MySQL安裝教程,其實(shí)好多公司,數(shù)據(jù)庫(kù)的面試題都是不可避免的,甚至一些前端工程師面試的時(shí)候都避免不了被詢問(wèn)到和數(shù)據(jù)庫(kù)有關(guān)的一些問(wèn)題。下面就從最基礎(chǔ)的安裝教程開(kāi)始,需要的朋友可以參考一下
    2021-11-11
  • 詳解Mysql主從同步配置實(shí)戰(zhàn)

    詳解Mysql主從同步配置實(shí)戰(zhàn)

    這篇文章主要介紹了詳解Mysql主從同步實(shí)戰(zhàn),實(shí)例分析了Mysql主從同步的原理和實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2017-03-03
  • MySQL常見(jiàn)內(nèi)存不足啟動(dòng)失敗的完美解決方法

    MySQL常見(jiàn)內(nèi)存不足啟動(dòng)失敗的完美解決方法

    這篇文章主要介紹了MySQL常見(jiàn)內(nèi)存不足啟動(dòng)失敗的完美解決方法,需要的朋友可以參考下
    2018-03-03
  • linux下安裝mysql及mysql.sock問(wèn)題

    linux下安裝mysql及mysql.sock問(wèn)題

    最近在linux上裝mysql時(shí)遇到一些棘手的問(wèn)題,百思不得其解,下面小編給大家?guī)?lái)了linux下安裝mysql及mysql.sock問(wèn)題,感興趣的朋友一起看看吧
    2018-03-03
  • Mysql主從GTID與binlog的區(qū)別及說(shuō)明

    Mysql主從GTID與binlog的區(qū)別及說(shuō)明

    MySQL GTID(全局事務(wù)標(biāo)識(shí)符)與binlog(二進(jìn)制日志)是搭建主從復(fù)制的兩種機(jī)制,GTID為每個(gè)事務(wù)分配唯一標(biāo)識(shí),確保復(fù)制無(wú)數(shù)據(jù)沖突或丟失,便于復(fù)制配置和管理;binlog記錄所有數(shù)據(jù)庫(kù)更改,用于數(shù)據(jù)恢復(fù)和復(fù)制,GTID基于事務(wù)標(biāo)識(shí)
    2024-10-10
  • mysql大小寫敏感導(dǎo)致程序無(wú)法啟動(dòng)的問(wèn)題

    mysql大小寫敏感導(dǎo)致程序無(wú)法啟動(dòng)的問(wèn)題

    這篇文章主要介紹了mysql大小寫敏感導(dǎo)致程序無(wú)法啟動(dòng)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MySQL中慢查詢優(yōu)化的技術(shù)指南

    MySQL中慢查詢優(yōu)化的技術(shù)指南

    后端開(kāi)發(fā)中,數(shù)據(jù)庫(kù)是系統(tǒng)性能瓶頸的高發(fā)地帶,而慢查詢往往是系統(tǒng)響應(yīng)遲緩的罪魁禍?zhǔn)?本文將全面梳理慢SQL的優(yōu)化思路,感興趣的小伙伴可以了解下
    2025-06-06
  • 記一次MySQL更新語(yǔ)句update的踩坑

    記一次MySQL更新語(yǔ)句update的踩坑

    這篇文章主要介紹了記一次MySQL更新語(yǔ)句update的踩坑,幫助大家更好的理解和使用MySQL的更新語(yǔ)句,感興趣的朋友可以了解下
    2020-11-11
  • MySQL數(shù)據(jù)庫(kù)case?when?then?end的詳細(xì)使用方法

    MySQL數(shù)據(jù)庫(kù)case?when?then?end的詳細(xì)使用方法

    在SQL語(yǔ)法中我們首先使用CASE關(guān)鍵字開(kāi)頭,然后根據(jù)不同的條件使用WHEN關(guān)鍵字,并在每個(gè)條件后面指定結(jié)果,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)case?when?then?end的詳細(xì)使用方法,需要的朋友可以參考下
    2023-12-12

最新評(píng)論