一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL索引的常用知識點

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-30 16:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

索引結構:B+樹

索引其實是一種數據結構

注意B+樹是MySQL,索引默認的結構;一張表至少有一個索引(主鍵索引),是可以有多個索引的

MySQL中的B+Tree

  1. 非葉子節(jié)點也叫內部節(jié)點,只存儲 健值(主鍵的值) + 指針(存儲子節(jié)點的地址信息)
    • 主鍵索引:健值(主鍵的值) + 指針(存儲子節(jié)點的地址信息)
    • 非主鍵索引:非主鍵列的值 + 指向下一個節(jié)點的指針(存儲子節(jié)點的地址信息)
  2. 所有的數據都存在葉子節(jié)點中;
    • 同時葉子節(jié)點上還存有一個指向相鄰葉子節(jié)點的指針
    • 如果是聚簇索引(主鍵索引),葉子節(jié)點存儲的是實際數據
    • 如果是非聚簇索引,則保存的是聚簇索引的索引key,也就是主鍵索引的值;查詢非聚簇索引會有一個回表操作
  3. B+Tree的每個葉子節(jié)點增加了一個指向相鄰葉子節(jié)點的指針,它的最后一個數據會指向下一個葉子節(jié)點的第一個數據,形成了一個有序鏈表的結構。

為什么B+ 樹比B 樹更適合作為索引?

  1. B+ 樹的磁盤讀寫代價更低 B+ 樹的數據都集中在葉子節(jié)點,分支節(jié)點 只負責指針(索引);B 樹的分支節(jié)點既有指針也有數據 。這將導致B+ 樹的層高會小于B 樹的層高,也就是說B+ 樹平均的Io次數會小于B 樹。
  2. B+ 樹的查詢效率更加穩(wěn)定 B+ 樹的數據都存放在葉子節(jié)點,故任何關鍵字的查找必須走一條從根節(jié)點到葉子節(jié)點的路徑。所有關鍵字的查詢路徑相同,每個數據查詢效率相當。
  3. B+樹更便于遍歷 由于B+樹的數據都存儲在葉子結點中,分支結點均為索引,遍歷只需要掃描一遍葉子節(jié)點即可;B樹因為其分支結點同樣存儲著數據,要找到具體的數據,需要進行一次中序遍歷按序來搜索。
  4. B+樹更擅長范圍查詢 B+樹葉子節(jié)點存放數據,數據是按順序放置的雙向鏈表。B樹范圍查詢只能中序遍歷。
  5. B+ 樹占用內存空間小 B+ 樹索引節(jié)點沒有數據,比較小。在內存有限的情況下,相比于B樹索引可以加載更多B+ 樹索引。

MyISAM與InnoDB 的區(qū)別

  1. InnoDB支持事務,MyISAM不支持

  2. InnoDB支持外鍵,而MyISAM不支持

  3. InnoDB是聚集索引,數據和索引存到同一個文件里;MyISAM是非聚集索引,數據和索引不在同一個文件里;都是使用B+Tree作為索引結構

  4. InnoDB不保存表的具體行數,執(zhí)行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執(zhí)行上述語句時只需要讀出該變量即可,速度很快(注意不能加有任何WHERE條件)

    因為InnoDB的事務特性,在同一時刻表中的行數對于不同的事務而言是不一樣的,因此count統(tǒng)計會計算對于當前事務而言可以統(tǒng)計到的行數,而不是將總行數儲存起來方便快速查詢。InnoDB會嘗試遍歷一個盡可能小的索引除非優(yōu)化器提示使用別的索引。如果二級索引不存在,InnoDB還會嘗試去遍歷其他聚簇索引。

    如果索引并沒有完全處于InnoDB維護的緩沖區(qū)(Buffer Pool)中,count操作會比較費時??梢越⒁粋€記錄總行數的表并讓你的程序在INSERT/DELETE時更新對應的數據。和上面提到的問題一樣,如果此時存在多個事務的話這種方案也不太好用。如果得到大致的行數值已經足夠滿足需求可以嘗試SHOW TABLE STATUS

    • 那么為什么InnoDB沒有了這個變量呢?
  5. InnoDB支持表、行(默認)級鎖,而MyISAM僅支持表級鎖

  6. InnoDB表必須有唯一索引(如主鍵)(用戶沒有指定的話會自己找/生產一個隱藏列Row_id來充當默認主鍵),而Myisam可以沒有主鍵

  7. Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI

    • Innodb:frm是表定義文件,ibd是數據文件
    • Myisam:frm是表定義文件,myd是數據文件,myi是索引文件

索引失效的場景

  1. 對索引列使用了函數、表達式或運算符:當查詢條件中使用了函數、表達式或運算符時,MySQL就無法使用該列的索引,因為它需要對每行數據進行計算,而不是直接查找索引。
  2. 查詢條件中使用了不等于操作符(<>、!=)、NOT NULL, NOT IN 等
  3. 模糊查詢:當查詢條件中使用了LIKE、%或_等模糊匹配符號時,MySQL無法使用索引進行快速定位。
  4. OR條件:當查詢條件中包含多個OR條件時,MySQL無法使用索引進行快速定位。
  5. 范圍查詢:當查詢條件中使用了BETWEEN、<、>、<=、>=等操作符時,MySQL只能使用索引中的一部分數據,需要讀取更多的數據進行過濾,降低了查詢效率。
  6. 數據類型不匹配,需要隱式轉換類型
  7. 對索引列進行排序,因為它需要將數據按照指定的順序進行排序
  8. 復合索引,如果不使用前列,后續(xù)列也將無法使用

小結

正確的使用索引,能夠顯著提高數據庫的查詢效率。本文匯總了MySQL索引的常用知識點,幫助大家快速記憶

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 緩沖
    +關注

    關注

    0

    文章

    53

    瀏覽量

    18033
  • 指針
    +關注

    關注

    1

    文章

    484

    瀏覽量

    71197
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40749
  • MySQL
    +關注

    關注

    1

    文章

    860

    瀏覽量

    27941
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Jackson常用知識點和易錯

    Jackson常用知識點和易錯
    發(fā)表于 06-12 17:22

    電機選型設計的常用公式與知識點

    電機選型設計的常用公式與知識點匯總
    發(fā)表于 01-27 06:46

    linux常用的命令知識點

    Linux基礎命令的總結linux常用的命令知識點
    發(fā)表于 02-02 06:31

    STM32外部中斷知識點概述

    STM32外部中斷概述知識點(1)知識點(2)知識點(3)中斷服務函數外部中斷常用庫函數外部中斷的一般配置步驟知識點(1)STM32的每個I
    發(fā)表于 08-16 07:43

    高一數學知識點總結

    高一數學知識點總結高一數學知識點總結高一數學知識點總結
    發(fā)表于 02-23 15:27 ?0次下載

    高二數學知識點總結

    高二數學知識點總結高二數學知識點總結高二數學知識點總結
    發(fā)表于 02-23 15:27 ?0次下載

    PWM知識點詳解

    PWM知識點
    發(fā)表于 03-16 08:00 ?44次下載

    干貨分享:有關電機的常用知識點

    電機的應用領域十分廣泛,像無人機、機器手臂、電動工具以及工業(yè)自動化等。許多剛開始接觸電機的工程師會有一些疑惑,今天給大家整理了關于電機的 11 個常用知識點,重點介紹了一些容易被忽略但很重要的知識點
    的頭像 發(fā)表于 10-30 17:43 ?1427次閱讀

    MySQL索引的使用問題

    MySQL 在LIKE進行模糊匹配的時候又是如何利用索引的呢?3、MySQL 到底在怎么樣的情況下能夠利用索引進行排序?今天,我將會用一個模型,把這些問題都一一解答,讓你對
    的頭像 發(fā)表于 01-06 16:13 ?1814次閱讀

    MySQL的基本知識點梳理和常用操作總結

    本文主要是總結了工作中一些常用的操作,以及不合理的操作,在對慢查詢進行優(yōu)化時收集的一些有用的資料和信息,本文適合有mysql基礎的開發(fā)人員。 一、索引相關 1、索引基數:基數是數據列所
    的頭像 發(fā)表于 02-04 13:44 ?1907次閱讀
    <b class='flag-5'>MySQL</b>的基本<b class='flag-5'>知識點</b>梳理和<b class='flag-5'>常用</b>操作總結

    嵌入式知識點總結

    嵌入式知識點總結(arm嵌入式開發(fā)led過程)-嵌入式知識點總結? ? ? ? ? ? ? ? ? ??
    發(fā)表于 07-30 14:20 ?23次下載
    嵌入式<b class='flag-5'>知識點</b>總結

    MySQL索引下推知識分享

    Mysql 是大家最常用的數據庫,下面為大家?guī)?mysql 索引下推知識點的分享,以便鞏固 mysql 基礎
    的頭像 發(fā)表于 12-27 09:49 ?836次閱讀

    數字電路知識點總結

    本文整理了數字電路課程中的相關基本的知識點和較為重要的知識點,用于求職的數電部分的知識準備,差缺補漏。
    的頭像 發(fā)表于 05-30 15:07 ?5708次閱讀
    數字電路<b class='flag-5'>知識點</b>總結

    MySQL高級進階:索引優(yōu)化

    MySQL官方對于索引的定義:索引是幫助MySQL高效獲取數據的數據結構。
    的頭像 發(fā)表于 06-11 11:13 ?863次閱讀
    <b class='flag-5'>MySQL</b>高級進階:<b class='flag-5'>索引</b>優(yōu)化

    MySQL知識點匯總

    大家好,這部分被稱為DQL部分,是每個學習MySQL必須要學會的部分,下面就讓我來介紹MySQL中的其他部分。
    的頭像 發(fā)表于 08-05 15:27 ?657次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>知識點</b>匯總