最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中主鍵索引和聯(lián)合索引的原理與區(qū)別

 更新時(shí)間:2024年04月14日 16:05:38   作者:敲代碼敲到頭發(fā)茂密  
索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了mysql中主鍵索引和聯(lián)合索引的原理與區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下

一、主鍵索引

主鍵索引:按照主鍵數(shù)據(jù)從小到大按照從左到右進(jìn)行排序,葉節(jié)點(diǎn)只存儲(chǔ)數(shù)據(jù)區(qū);
接著將上面的頁(yè)生成出來(lái),頁(yè)只存儲(chǔ)索引和指針,指針指向數(shù)據(jù)域,當(dāng)通過(guò)主鍵查找數(shù)據(jù)時(shí),從B+樹(shù)的頭部開(kāi)始尋址數(shù)據(jù)、讀取數(shù)據(jù)。

在這里插入圖片描述

上面為索引頁(yè)
下面為數(shù)據(jù)頁(yè)

查詢select * from table where a=6,會(huì)從上到下走法,找索引

查詢select * from table where a<6,會(huì)從上到下走法,找索引;
原因:先找a=6是走索引的,找到a=6數(shù)據(jù)后,將左邊的數(shù)據(jù)全部返回即可。

為了方便把前面數(shù)據(jù)給你采用雙向指針

查詢select * from table where b=6,會(huì)從左到右走法,全表掃描,因?yàn)閎未有命中索引。

二、什么是聯(lián)合索引? 對(duì)應(yīng)的B+樹(shù)是如何生成的?

聯(lián)合索引:將數(shù)據(jù)庫(kù)表中多個(gè)字段組成一個(gè)索引。bcd聯(lián)合索引;bcd三個(gè)字段進(jìn)行排序

1、建立索引方式

create index idx_t1_bcd on t1(b,c,d);bcd三個(gè)字段進(jìn)行排序

2、什么是最左前綴原則?

復(fù)合索引,也叫聯(lián)合索引,用戶可以在多個(gè)列上建立索引,這種索引叫做復(fù)合索引。
當(dāng)我們創(chuàng)建一個(gè)組合索引的時(shí)候,如(k1,k2,k3),相當(dāng)于創(chuàng)建了(k1)、
(k1,k2)和(k1,k2,k3)三個(gè)索引,這就是最左匹配原則。

select * from table where k1=A and k2=B and k3=C

3、回表

在這里插入圖片描述

select * from t1 where b=1 and c=1 and d=1執(zhí)行邏輯:
通過(guò)聯(lián)合索引找到一條數(shù)據(jù)的3個(gè)字段,但是select * 查找多個(gè)字段,所以需要存儲(chǔ)主鍵字段,通過(guò)主鍵字段去主鍵索引里面找到完整的這條數(shù)據(jù),并將這條數(shù)據(jù)返回。

通過(guò)主鍵再去主鍵索引里面找數(shù)據(jù)的過(guò)程叫做回表

4、為什么要遵守最左前綴原則才能利用到索引?

explain select * from t1 where c=1 and d=1 and b=1 ;
最左前綴原則和后面條件的順序沒(méi)有關(guān)系

不符合最左匹配原則:*11

符合最左匹配原則:1*1

b=1:走聯(lián)合索引 (需要回表1次)

b>1:不走聯(lián)合索引(因?yàn)樾枰乇砗芏啻危?/p>

拿到主鍵會(huì)到主鍵索引里面拿數(shù)據(jù)(回表7次)

5、什么是覆蓋索引?

查詢的字段正好在聯(lián)合索引字段里面,不需要回表

select b from t1 where b>1;(不需要回表了,直接從聯(lián)合索引字段中將該字段取出來(lái))

select a,b,c,d from t1 where b>1;

同樣的也符合聯(lián)合索引,也不需要回表,因?yàn)閍字段(主鍵)在聯(lián)合索引中。

select a,b,c,d,e from t1 where b>1;

不走聯(lián)合索引,需要回表,因?yàn)閑字段不在聯(lián)合索引中,需要回表很多次

6、索引掃描底層原理

從bcd索引的葉子節(jié)點(diǎn)開(kāi)始遍歷
主鍵索引存儲(chǔ)的是8條完整的數(shù)據(jù)
聯(lián)合索引中存儲(chǔ)的是8條不完整的數(shù)據(jù),并且b字段在聯(lián)合索引中,不會(huì)去回表到主鍵索引中。

從葉子節(jié)點(diǎn)開(kāi)始掃描不需要符合最左匹配原則。

7、order by為什么會(huì)導(dǎo)致索引消失?

因?yàn)樽呷頀呙栊矢撸恍枰乇?br />走索引會(huì)回表多次,效率低

8、有哪些情況會(huì)導(dǎo)致索引失效?

1、索引列使用!=、not、is null、is not null查詢的時(shí)候,由于索引數(shù)據(jù)的檢索效率非常低,因此Mysql引擎會(huì)判斷不走索引。

2、使用like通配符匹配后綴%xxx的時(shí)候,由于這種方式不符合索引的最左匹配原則,所以也不會(huì)走索引。

  • 但是反過(guò)來(lái),如果通配符匹配的是前綴xxx%,符合最左匹配,也會(huì)走索引。

3、對(duì)索引列上進(jìn)行函數(shù)運(yùn)算、導(dǎo)致mysql無(wú)法識(shí)別索引列,就不會(huì)走索引了。

4、使用or連接查詢的時(shí)候,or語(yǔ)句前后沒(méi)有同時(shí)使用索引,那么索引會(huì)失效。只有or左右查詢字段都是索引列的時(shí)候,才會(huì)生效。

5、當(dāng)索引列存在隱式轉(zhuǎn)化的時(shí)候, 比如索引列是字符串類型,但是在sql查詢中沒(méi)有使用引號(hào)。

9、索引設(shè)計(jì)原則

查詢更快、占用空間更小

1、選擇合適的列作為索引

  • 1.經(jīng)常作為查詢條件(where子句)、排序條件(order by子句) 分組條件(group by子句)的列建立索引。
  • 2、區(qū)分度低的字段,例如性別,不要建立索引
  • 3、更新頻繁字段不適合創(chuàng)建索引
  • 4、對(duì)于定義為text、image和bit的數(shù)據(jù)類型的列不要建立索引
  • 5、定義有外鍵的數(shù)據(jù)列一定要建立索引。
  • 6、數(shù)據(jù)量較小的表,索引效果較差,沒(méi)有必要在此列建立索引
  • 7、盡量使用擴(kuò)展索引,不要新建索引。比如表中已經(jīng)有a的索引,現(xiàn)在要加(a,b)的索引,那么只需要修改原來(lái)的索引即可。
  • 8、使用短索引,如果對(duì)長(zhǎng)字符串列進(jìn)行索引,應(yīng)該指定一個(gè)前綴長(zhǎng)度,這樣能夠節(jié)省大量索引空間,如果搜索詞
    超過(guò)索引前綴長(zhǎng)度,則使用索引排除不匹配的行,然后檢查其余行是否可能匹配。

2、避免使用過(guò)多的索引

  • 1、每個(gè)索引都需要占用額外的磁盤空間
  • 2、更新表(update、insert、delete操作時(shí)),所有的索引都需要被更新
  • 3、維護(hù)索引需要成本

三、InnoDB 與MyISAM 的區(qū)別

聚簇索引:將數(shù)據(jù)存儲(chǔ)與索引放到了一塊、并且是按照一定的順序組織的,找到索引也就找到了數(shù)據(jù),數(shù)據(jù)的物理存放順序與索引順序是一致的,即:只要索引是相鄰的,那么對(duì)應(yīng)的數(shù)據(jù)一定也是相鄰地存放在磁盤上的。

非聚簇索引:葉子節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)、存儲(chǔ)的是數(shù)據(jù)行地址,也就是說(shuō)根據(jù)索引查找到數(shù)據(jù)行的位置再取磁盤查找數(shù)據(jù),這個(gè)就有點(diǎn)類似一本樹(shù)的目錄,比如我們要找第三章第一節(jié),那我們先在這個(gè)目錄里面找,找到對(duì)應(yīng)的頁(yè)碼后再去對(duì)應(yīng)的頁(yè)碼看文章。

優(yōu)勢(shì):
1、查詢通過(guò)聚簇索引可以直接獲取數(shù)據(jù),相比非聚簇索引需要第二次查詢(非覆蓋索引的情況下)效率要高
2、聚簇索引對(duì)于范圍查詢的效率很高,因?yàn)槠鋽?shù)據(jù)是按照大小排列的
3、聚簇索引適合用在排序的場(chǎng)合,非聚簇索引不適合

到此這篇關(guān)于mysql中主鍵索引和聯(lián)合索引的原理與區(qū)別的文章就介紹到這了,更多相關(guān)mysql 主鍵索引和聯(lián)合索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MYSQL表分區(qū)的實(shí)現(xiàn)示例

    MYSQL表分區(qū)的實(shí)現(xiàn)示例

    表分區(qū)是將表中的數(shù)據(jù)按照某種規(guī)則分散存儲(chǔ)到多個(gè)分區(qū)中,每個(gè)分區(qū)可以獨(dú)立地進(jìn)行操作,例如查詢、插入、更新和刪除,下面就來(lái)介紹一下MYSQL表分區(qū)的實(shí)現(xiàn)
    2025-09-09
  • 深入理解MySQL中MVCC與BufferPool緩存機(jī)制

    深入理解MySQL中MVCC與BufferPool緩存機(jī)制

    這篇文章主要介紹了深入理解MySQL中MVCC與BufferPool緩存機(jī)制,MySQL默認(rèn)RR隔離級(jí)別就是通過(guò)該機(jī)制來(lái)保證的MVCC,更多主題相關(guān)內(nèi)容,需要的可以參考下面文章內(nèi)容介紹
    2022-05-05
  • mysql如何在存儲(chǔ)過(guò)程中輸出日志信息

    mysql如何在存儲(chǔ)過(guò)程中輸出日志信息

    這篇文章主要介紹了mysql如何在存儲(chǔ)過(guò)程中輸出日志信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MySQL中日期和時(shí)間戳互相轉(zhuǎn)換的函數(shù)和方法

    MySQL中日期和時(shí)間戳互相轉(zhuǎn)換的函數(shù)和方法

    這篇文章主要介紹了MySQL中日期和時(shí)間戳互相轉(zhuǎn)換的函數(shù)和方法,本文分別講解了時(shí)間戳轉(zhuǎn)換成日期的方法和把日期轉(zhuǎn)換為時(shí)間戳的方法,需要的朋友可以參考下
    2015-06-06
  • MySQL字符集utf8修改為utf8mb4的方法步驟

    MySQL字符集utf8修改為utf8mb4的方法步驟

    這篇文章主要給大家介紹了關(guān)于MySQL字符集utf8修改為utf8mb4的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • MySql事務(wù)無(wú)法回滾的原因有哪些

    MySql事務(wù)無(wú)法回滾的原因有哪些

    使用MySQL時(shí),如果發(fā)現(xiàn)事務(wù)無(wú)法回滾,但Hibernate、Spring、JDBC等配置又沒(méi)有明顯問(wèn)題,到底是什么原因,下面與大家分享下
    2014-07-07
  • mysql回表致索引失效案例講解

    mysql回表致索引失效案例講解

    這篇文章主要介紹了mysql回表致索引失效案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 超詳細(xì)教你怎么升級(jí)Mysql的版本

    超詳細(xì)教你怎么升級(jí)Mysql的版本

    今天教各位小伙伴怎么升級(jí)Mysql的版本,文中非常詳細(xì)的介紹了Mysql更換版本的操作,包括數(shù)據(jù)備份,卸載,安裝.對(duì)不會(huì)升級(jí)的小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-05-05
  • 解決mysql5.6 utf8設(shè)置無(wú)效問(wèn)題

    解決mysql5.6 utf8設(shè)置無(wú)效問(wèn)題

    這篇文章主要介紹了mysql5.6 utf8設(shè)置無(wú)效問(wèn)題,本文雖然內(nèi)容不長(zhǎng),但是解決方法給出,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • mysql中between的用法及說(shuō)明

    mysql中between的用法及說(shuō)明

    這篇文章主要介紹了mysql中between的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

惠水县| 荥经县| 巴东县| 扎鲁特旗| 贞丰县| 乡宁县| 万安县| 陇西县| 磐石市| 齐齐哈尔市| 乐清市| 瑞昌市| 榆社县| 徐汇区| 离岛区| 家居| 阿荣旗| 鲁甸县| 涟水县| 定远县| 中方县| 舞钢市| 闽清县| 赫章县| 长沙市| 三河市| 民丰县| 丰都县| 抚州市| 东乡族自治县| 沙雅县| 通州市| 崇礼县| 安乡县| 洛阳市| 宝坻区| 噶尔县| 邓州市| 穆棱市| 高唐县| 杭锦后旗|