(新手友好)MySQL學習筆記(9):索引(常見索引類型,查找結構的發展(二分查找法,二叉搜索樹,平衡二叉樹,B樹,B+樹))

目錄

索引

常見索引類型

B+樹

二分查找法

二叉搜索樹和平衡二叉樹

B樹和B+樹


?

索引

index,是存儲引擎用于快速找到數據的一種數據結構。

MySQL默認使用InnoDB存儲引擎,該存儲引擎是最重要,使用最廣泛的,除非有非常特別的原因需要使用其他存儲引擎,否則優先考慮InnoDB。

索引優點:

  • 減少服務器需要掃描的數據量
  • 幫助服務器避免排序和臨時表
  • 索引可以將隨機I/O變為順序I/O,提高查詢性能

缺點:

  • 從空間角度考慮,建立索引需要占用物理空間
  • 從時間角度考慮,創建和維護索引都需要花費時間,例如對數據進行增刪改時就需要維護索引。

因此在不需要頻繁的增刪改但需要頻繁查的表中創建索引是更好的選擇。

我們建立索引就類似于建議一個圖中黃色的一個索引表,通過author字段快速定位,然后找到需要的數據,這只是一個例子方便我們理解,不是真正的索引運行。

常見索引類型

  • 哈希索引:基于哈希表實現,查找非常快。但不支持范圍查找和排序操作,也不支持部分索引列的查找,只支持等值比較的查詢。如果哈希沖突很多的話,索引的維護代價會很高。因此,哈希索引只適用于某些特定場合。在InnoDB中,支持的哈希索引是自適應的,不能人為創建。

哈希索引不支持范圍查找的原因:哈希索引只包含哈希值和行指針,通過找哈希值通過行指針來找到要查找的數據,存儲時輸入的數據通過哈希函數映射出一個哈希值,但是哈希值是無序的,就像1,2映射出的哈希值就可能是5678和1234,因此哈希索引每查詢一個就要全盤掃描來尋找下一個要查詢的哈希值,因此哈希索引不支持范圍查詢。

哈希索引不支持排序操作的原因:與不支持范圍查找的原因相同,因為每行數據的哈希值不含有任何順序特性,即使原始字段值是按照某種順序排列的,經過哈希函數處理后,這些值在哈希索引的存儲順序也是完全被打亂的。所以在對某一列進行排序時哈希索引不能提供任何幫助,因為它的結構中沒有保留字段值的順序信息。

  • 全文索引:用于全文搜索的索引類型(倒排索引),可以執行關鍵字搜索。全文索引有很多限制,例如當數據量很大,內存無法裝載全部索引時,搜索速度會非常慢。同時全文索引的維護成本也很大。MyISAM支持全文索引,InnoDB從1.2版本(MySQL5.6)開始支持全文索引。
  • B+樹索引:B+樹索引就是傳統意義上的索引,時目前關系型數據庫中查找最為常見和最為有效的索引。B+樹索引能夠加快訪問數據的速度,因為存儲引擎不再需要進行全表掃描來獲取需要的數據。B+樹索引是順序組織存儲的,所以很適合查找范圍數據,查到范圍中的首個數據后就可以一直查找到范圍中最后一個數據,不需要全表掃描。B+樹索引分為聚簇索引(主鍵索引)和非聚簇索引(二級索引)。

B+樹

主要闡述一下常見的搜尋方法和B+樹怎么發展出來的

二分查找法

從5,10,19,21,31,37,42,48,50,55中查找48,使用二分查找法只需3次。如果順序查找需要8次。

二叉搜索樹和平衡二叉樹

二叉搜索樹,左子節點小于父節點的值,右子節點大于父節點的值。如果我們需要查找8,需要3次,而順序查找需要6次。

同樣是二叉搜索樹,下圖的情況查找效率會很低,從而引出平衡二叉樹(AVL樹),平衡二叉樹要求任何節點的子樹高度最大差為1。平衡性確保查找的數獨可以很快,避免了下圖二叉搜索樹的極端情況,即樹退化成鏈表

B樹和B+樹

平衡二叉樹隨著節點的增加,樹的高度會越來越高,會增加磁盤的I/O次數,影響查詢效率,從而引出了B樹,B樹不限制一個節點只能由2個子節點,從而降低樹的高度。

B樹可以將節點的大小優化為磁盤塊的大小,每次讀取可以有效加載多個節點,B樹常用于數據庫等需要高效訪問磁盤的場景。

B+樹是對B樹的升級,B+樹只有葉子節點存數據,非葉子節點只存索引。葉子節點包含所有索引,葉子節點構成一個有序鏈表,范圍查找更快。由于非葉子節點只存索引,B+樹比B樹的非葉子節點可以存更多索引,高度更低,磁盤I/O次數更少。

B+樹范圍搜索更快的原因:

由兩張圖我們可以看出B+樹的葉子節點構成了一個有序鏈表,而B樹則沒有組成一個有序鏈表,如果要查1—10條數據,B+樹找到第1條數據之后就可以沿著鏈表一直找到第10條,但B樹找到第1條數據后可以找到第2條但是第3條記錄就需要重新掃描去找,因此B+樹的范圍索引更快。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87615.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87615.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進程間通信1(匿名管道)Linux

1 進程間通信的必要性 首先要明確進程間是相互獨立的(獨享一份虛擬地址空間,頁表,資源),那怎么樣才能使得兩個進程間實現資源的發送?所以,兩個進程一定需要看到同一份資源,并且?個…

CAN2.0、DoIP、CAN-FD汽車協議詳解與應用

一、CAN2.0 協議詳解與應用示例 1. 技術原理與特性 協議架構:基于 ISO 11898 標準,采用載波監聽多路訪問 / 沖突檢測(CSMA/CD)機制,支持 11 位(CAN2.0A)或 29 位(CAN2.0B&#xff…

使用nvm管理npm和pnpm

1.使用nvm管理npm // 查看nvm版本 nvm -v // 查看可安裝的 node 版本 nvm ls-remote // 安裝指定 node 版本 nvm install 24.0.0 // 查看當前已安裝的 node 版本及當前使用的版本 nvm list // 使用某個版本 node nvm use 24.0.0 // 卸載指定 node 版本 nvm uninstall 16.20.1…

YOLO11+QT6+Opencv+C++訓練加載模型全過程講解

實現效果: Yolov11環境搭建(搭建好的可以直接跳過) 最好使用Anconda進行包管理,安裝可參考【文章】。下面簡單過一下如何快速部署環境。如果搭建過或可以參考其他文章可以跳過Yolo11環境搭建這一章節。總體來說Yolov11環境搭建越…

Python 腳本,用于將 PDF 文件高質量地轉換為 PNG 圖像

import os import fitz # PyMuPDF from PIL import Image import argparse import logging from tqdm import tqdm# 配置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(PDF2PNG)def convert_pdf_…

【CUDA GPU 支持安裝全攻略】PyTorch 深度學習開發者指南

PyTorch 的 CUDA GPU 支持 安裝五條鐵律(最新版 2025 修訂)(適用于所有用戶)-CSDN博客 是否需要預先安裝 CUDA Toolkit?——按使用場景分級推薦及進階說明-CSDN博客 “100% 成功的 PyTorch CUDA GPU 支持” 安裝攻略…

Cyberith 運動模擬器Virtualizer2:提升虛擬現實沉浸體驗

奧地利Cyberith公司是一家專注于虛擬現實(VR)互動解決方案的創新型科技企業,以其研發的Virtualizer虛擬現實步態模擬設備而聞名。該公司的核心技術體現在其設計和制造的全方位跑步機式VR交互平臺上,使得用戶能夠在虛擬環境中實現自…

常見的數據處理方法有哪些?ETL中的數據處理怎么完成

在數字化轉型縱深推進的背景下,數據作為新型生產要素已成為驅動企業戰略決策、科研創新及智能化運營的核心戰略資產。數據治理價值鏈中的處理環節作為關鍵價值節點,其本質是通過系統化處理流程將原始觀測數據轉化為結構化知識產物,以支撐預測…

WHAT - 為甲方做一個官網(二)- 快速版

文章目錄 一、明確需求優先級(快速決策)二、推薦零代碼/低代碼工具(附對比)方案1:低代碼建站平臺(適合無技術用戶,拖拽式操作)方案2:CMS系統(適合內容更新頻繁…

音視頻之H.264視頻編碼傳輸及其在移動通信中的應用

系列文章: 1、音視頻之視頻壓縮技術及數字視頻綜述 2、音視頻之視頻壓縮編碼的基本原理 3、音視頻之H.264/AVC編碼器原理 4、音視頻之H.264的句法和語義 5、音視頻之H.264/AVC解碼器的原理和實現 6、音視頻之H.264視頻編碼傳輸及其在移動通信中的應用 7、音視…

C#語言入門-task2 :C# 語言的基本語法結構

下面從四個方面對C#的基本語法進行簡單介紹: 1. 數據類型 C#的類型可分為值類型和引用類型。值類型變量直接存儲數據,引用類型變量則存儲對象的引用。 值類型:涵蓋整數類型(像int、long)、浮點類型(例如…

c#筆記之類的常量、字段和屬性

學習內容: 一、字段 字段是為了對象或者類型存儲數據的,可以表達一個對象或者類型的狀態;也叫做成員變量;注意字段是在類里面聲明的;在方法里聲明的是局部變量; 1.1實例字段 用來表示每個實例的狀態;比如一個students類;要了解一個學生一般看名字和成績;所以名字和…

Linux 常用命令(入門)

Linux 常用命令 一、Linux 命令基礎 (一)命令格式 Linux 命令的一般格式為:command [-options] [parameter1] … 。其中,command 是命令名,通常是相應功能的英文單詞或其縮寫;[-options] 是選項,用于對命令進行控制,可省略;parameter1 … 是傳給命令的參數,可以是…

CppCon 2016 學習:Parallelism in Modern C++

這段介紹的是 HPX (High Performance ParalleX),一個現代C的通用并行運行時系統,重點包括: 通用性:適用于各種規模的應用,從小型到超大規模分布式系統。統一標準API:符合C標準,方便編寫異步、并…

機器學習監督學習實戰七:文本卷積神經網絡TextCNN對中文短文本分類(15類)

本文介紹了一個基于TextCNN模型的文本分類項目,使用今日頭條新聞數據集進行訓練和評估。項目包括數據獲取、預處理、模型訓練、評估測試等環節。數據預處理涉及清洗文本、中文分詞、去除停用詞、構建詞匯表和向量化等步驟。TextCNN模型通過卷積層和池化層提取文本特…

iot-dc3 項目Bug修復保姆喂奶級教程

一.Uncaught (in promise) ReferenceError: TinyArea is not defined 1.觸發場景 前端設備模塊,點擊關聯模板、關聯位號、設備數據,無反應,一直切不過去,沒有報錯通知,F12查看控制臺報錯如下: 2.引起原因 前端導入的庫為"@antv/g2": "^5.3.0",在 P…

Spring Boot + MyBatis Plus + SpringAI + Vue 畢設項目開發全解析(源碼)

前言 前些天發現了一個巨牛的人工智能免費學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站 Spring Boot MyBatis Plus SpringAI Vue 畢設項目開發全解析 目錄 一、項目概述與技術選型 項目背景與需求分析技術棧選擇…

Vitess數據庫部署與運維深度指南:構建可伸縮、高可用與安全的云原生數據庫

摘要 Vitess是一個為MySQL和MariaDB設計的云原生、水平可伸縮的分布式數據庫系統,它通過分片(sharding)實現無限擴展,同時保持對應用程序的透明性,使其無需感知底層數據分布。該項目于2019年從云原生計算基金會&#…

SpringAI+DeepSeek大模型應用開發——6基于MongDB持久化對話

持久化對話 默認情況下,聊天記憶存儲在內存中ChatMemory chatMemory new InMemoryChatMemory()。 如果需要持久化存儲,可以實現一個自定義的聊天記憶存儲類,以便將聊天消息存儲在你選擇的任何持久化存儲介質中。 MongoDB 文檔型數據庫&…

Mac電腦-音視頻剪輯編輯-Final Cut Pro X(fcpx)

Final Cut Pro Mac是一款專業的視頻剪輯工具,專為蘋果用戶設計。 它具備強大的視頻剪輯、音軌、圖形特效和調色功能,支持整片輸出,提升創作效率。 經過Apple芯片優化,利用Metal引擎動力,可處理更復雜的項目&#xff…