RM新时代网站-首页

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MySQL索引的常用知識(shí)點(diǎn)

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-30 16:43 ? 次閱讀

索引結(jié)構(gòu):B+樹

索引其實(shí)是一種數(shù)據(jù)結(jié)構(gòu)

注意B+樹是MySQL,索引默認(rèn)的結(jié)構(gòu);一張表至少有一個(gè)索引(主鍵索引),是可以有多個(gè)索引的

MySQL中的B+Tree

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

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

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

MyISAM與InnoDB 的區(qū)別

  1. InnoDB支持事務(wù),MyISAM不支持

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

  3. InnoDB是聚集索引,數(shù)據(jù)和索引存到同一個(gè)文件里;MyISAM是非聚集索引,數(shù)據(jù)和索引不在同一個(gè)文件里;都是使用B+Tree作為索引結(jié)構(gòu)

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

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

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

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

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

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

    • Innodb:frm是表定義文件,ibd是數(shù)據(jù)文件
    • Myisam:frm是表定義文件,myd是數(shù)據(jù)文件,myi是索引文件

索引失效的場(chǎng)景

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

小結(jié)

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

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

    關(guān)注

    0

    文章

    52

    瀏覽量

    17819
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    480

    瀏覽量

    70551
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40121
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    804

    瀏覽量

    26528
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Jackson常用知識(shí)點(diǎn)和易錯(cuò)點(diǎn)

    Jackson常用知識(shí)點(diǎn)和易錯(cuò)點(diǎn)
    發(fā)表于 06-12 17:22

    電機(jī)選型設(shè)計(jì)的常用公式與知識(shí)點(diǎn)

    電機(jī)選型設(shè)計(jì)的常用公式與知識(shí)點(diǎn)匯總
    發(fā)表于 01-27 06:46

    linux常用的命令知識(shí)點(diǎn)

    Linux基礎(chǔ)命令的總結(jié)linux常用的命令知識(shí)點(diǎn)
    發(fā)表于 02-02 06:31

    STM32外部中斷知識(shí)點(diǎn)概述

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

    高一數(shù)學(xué)知識(shí)點(diǎn)總結(jié)

    高一數(shù)學(xué)知識(shí)點(diǎn)總結(jié)高一數(shù)學(xué)知識(shí)點(diǎn)總結(jié)高一數(shù)學(xué)知識(shí)點(diǎn)總結(jié)
    發(fā)表于 02-23 15:27 ?0次下載

    高二數(shù)學(xué)知識(shí)點(diǎn)總結(jié)

    高二數(shù)學(xué)知識(shí)點(diǎn)總結(jié)高二數(shù)學(xué)知識(shí)點(diǎn)總結(jié)高二數(shù)學(xué)知識(shí)點(diǎn)總結(jié)
    發(fā)表于 02-23 15:27 ?0次下載

    PWM知識(shí)點(diǎn)詳解

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

    MySQL索引的使用問題

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

    MySQL的基本知識(shí)點(diǎn)梳理和常用操作總結(jié)

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

    嵌入式知識(shí)點(diǎn)總結(jié)

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

    電力基礎(chǔ)知識(shí)點(diǎn)合集

    電力基礎(chǔ)知識(shí)點(diǎn)合集
    發(fā)表于 03-14 16:35 ?0次下載

    MySQL索引下推知識(shí)分享

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

    數(shù)字電路知識(shí)點(diǎn)總結(jié)

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

    MySQL高級(jí)進(jìn)階:索引優(yōu)化

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

    MySQL知識(shí)點(diǎn)匯總

    大家好,這部分被稱為DQL部分,是每個(gè)學(xué)習(xí)MySQL必須要學(xué)會(huì)的部分,下面就讓我來介紹MySQL中的其他部分。
    的頭像 發(fā)表于 08-05 15:27 ?394次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>知識(shí)點(diǎn)</b>匯總
    RM新时代网站-首页