亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談Mysql主鍵索引與非主鍵索引區(qū)別

 更新時(shí)間:2021年09月05日 16:10:14   作者:#FJW  
本文主要介紹了ysql主鍵索引與非主鍵索引區(qū)別,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

什么是索引

MySql官方索引的定義:索引(Index)是幫助MySql高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),索引的目的在于提高查詢效率,類比字典;實(shí)際上索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄,索引列也是要占用空間。

主鍵索引和普通索引的區(qū)別

1.主鍵索引索引著數(shù)據(jù),然而普通索引索引著主鍵ID值(這是在innodb中,但是如果是myisam中,主鍵索引和普通索引是沒(méi)有區(qū)別的都是直接索引著數(shù)據(jù))
2.當(dāng)你查詢用的是where id=x 時(shí),那只需要掃描一遍主鍵索引,然后拿到相應(yīng)數(shù)據(jù),但是如果是查詢的普通索引的話,那么會(huì)先掃描一次普通索引,拿到主鍵值,然后再去掃主鍵索引,拿到所需要的數(shù)據(jù),這個(gè)過(guò)程叫做回表

索引具體采用的哪種數(shù)據(jù)結(jié)構(gòu)

常見(jiàn)的MySQL主要有兩種結(jié)構(gòu):Hash索引和B+ Tree索引,我們使用的是InnoDB引擎,默認(rèn)的是B+樹

InnoDB使用的B+ Tree的索引模型,那么為什么采用B+ 樹?這和Hash索引比較起來(lái)有什么優(yōu)缺點(diǎn)?

B+ Tree索引和Hash索引區(qū)別 哈希索引適合等值查詢,但是不無(wú)法進(jìn)行范圍查詢 哈希索引沒(méi)辦法利用索引完成排序 哈希索引不支持多列聯(lián)合索引的最左匹配規(guī)則 如果有大量重復(fù)鍵值得情況下,哈希索引的效率會(huì)很低,因?yàn)榇嬖诠E鲎矄?wèn)題

B+ Tree的葉子節(jié)點(diǎn)都可以存哪些東西?

在 InnoDB 里,索引B+ Tree的葉子節(jié)點(diǎn)存儲(chǔ)了整行數(shù)據(jù)的是主鍵索引,也被稱之為聚簇索引。而索引B+ Tree的葉子節(jié)點(diǎn)存儲(chǔ)了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引。

聚簇索引和非聚簇索引,在查詢數(shù)據(jù)的時(shí)候有區(qū)別?

聚簇索引查詢會(huì)更快
因?yàn)橹麈I索引樹的葉子節(jié)點(diǎn)直接就是我們要查詢的整行數(shù)據(jù)了。而非主鍵索引的葉子節(jié)點(diǎn)是主鍵的值,查到主鍵的值以后,還需要再通過(guò)主鍵的值再進(jìn)行一次查詢,這個(gè)過(guò)程稱作回表。
非主鍵索引一定會(huì)查詢多次嗎?
覆蓋索引也可以只查詢一次,覆蓋索引(covering index)指一個(gè)查詢語(yǔ)句的執(zhí)行只用從索引中就能夠取得,不必從數(shù)據(jù)表中讀取。也可以稱之為實(shí)現(xiàn)了索引覆蓋。 當(dāng)一條查詢語(yǔ)句符合覆蓋索引條件時(shí),MySQL只需要通過(guò)索引就可以返回查詢所需要的數(shù)據(jù),這樣避免了查到索引后再返回表操作,減少I/O提高效率。 如,表covering_index_sample中有一個(gè)普通索引 idx_key1_key2(key1,key2)。當(dāng)我們通過(guò)SQL語(yǔ)句:select key2 from covering_index_sample where key1 = ‘keytest';的時(shí)候,就可以通過(guò)覆蓋索引查詢,無(wú)需回表。

Index Condition Pushdown(索引下推)

MySQL 5.6引入了索引下推優(yōu)化,默認(rèn)開(kāi)啟,使用SET optimizer_switch = ‘index_condition_pushdown=off';可以將其關(guān)閉。官方文檔中給的例子和解釋如下: people表中(zipcode,lastname,firstname)構(gòu)成一個(gè)索引

WHERE zipcode=‘95054' AND lastname LIKE ‘%etrunia%' AND address LIKE ‘%Main Street%';

如果沒(méi)有使用索引下推技術(shù),則MySQL會(huì)通過(guò)zipcode='95054'從存儲(chǔ)引擎中查詢對(duì)應(yīng)的數(shù)據(jù),返回到MySQL服務(wù)端,然后MySQL服務(wù)端基于lastname LIKE '%etrunia%'和address LIKE '%Main Street%'來(lái)判斷數(shù)據(jù)是否符合條件。 如果使用了索引下推技術(shù),則MYSQL首先會(huì)返回符合zipcode='95054'的索引,然后根據(jù)lastname LIKE '%etrunia%'篩選出符合條件的索引后再返回到MySQL服務(wù)端,然后MySQL服務(wù)端基于address LIKE '%Main Street%'來(lái)判斷數(shù)據(jù)是否符合條件,這樣返回給MySQL服務(wù)端的索引數(shù)又會(huì)減少。有了索引下推優(yōu)化,可以在有l(wèi)ike條件查詢的情況下,減少回表次數(shù)。

查詢優(yōu)化器

一條SQL語(yǔ)句的查詢,可以有不同的執(zhí)行方案,至于最終選擇哪種方案,需要通過(guò)優(yōu)化器進(jìn)行選擇,選擇執(zhí)行成本最低的方案。 在一條單表查詢語(yǔ)句真正執(zhí)行之前,MySQL的查詢優(yōu)化器會(huì)找出執(zhí)行該語(yǔ)句所有可能使用的方案,對(duì)比之后找出成本最低的方案。這個(gè)成本最低的方案就是所謂的執(zhí)行計(jì)劃。 優(yōu)化過(guò)程大致如下: 1、根據(jù)搜索條件,找出所有可能使用的索引 2、計(jì)算全表掃描的代價(jià) 3、計(jì)算使用不同索引執(zhí)行查詢的代價(jià) 4、對(duì)比各種執(zhí)行方案的代價(jià),找出成本最低的那一個(gè)

關(guān)于索引的題

CREATE TABLE `geek` (
  `a` int(11) NOT NULL,
  `b` int(11) NOT NULL,
  `c` int(11) NOT NULL,
  `d` int(11) NOT NULL,
  PRIMARY KEY (`a`,`b`),
  KEY `c` (`c`),
  KEY `ca` (`c`,`a`),
  KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;

由于歷史原因,這個(gè)表需要 a、b 做聯(lián)合主鍵。
那意味著,單獨(dú)在字段 c 上創(chuàng)建一個(gè)索引,就已經(jīng)包含了三個(gè)字段,為什么要?jiǎng)?chuàng)建“ca”“cb”這兩個(gè)索引?

select * from geek where c=N order by a limit 1;
select * from geek where c=N order by b limit 1;

問(wèn)題:這位同事的解釋對(duì)嗎? 哪些索引沒(méi)有必要,可以刪除?

答案:

(1) 主鍵 a,b 的聚簇索引組織順序相當(dāng)于 order by a,b ,也就是先按 a 排序,再按 b 排序,c 無(wú)序。

–a--|–b--|–c--|–d--
1 2 3 d
1 3 2 d
1 4 3 d
2 1 3 d
2 2 2 d
2 3 4 d

(2) 索引 ca 的組織是先按 c 排序,再按 a 排序,同時(shí)記錄主鍵。

–c--|–a--|–主鍵部分b-- (注意,這里不是 ab,而是只有 b)
2 1 3
2 2 2
3 1 2
3 1 4
3 2 1
4 2 3

上面的這個(gè)索引ca 與索引c 的數(shù)據(jù)是一模一樣的。

(3) 索引 cb 的組織是先按 c 排序,在按 b 排序,同時(shí)記錄主鍵

–c--|–b--|–主鍵部分a-- (同上)
2 2 2
2 3 1
3 1 2
3 2 1
3 4 1
4 3 2

所以結(jié)論是ca可以去掉,cb保留。

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

相關(guān)文章

  • MySQL建表設(shè)置默認(rèn)值的取值范圍

    MySQL建表設(shè)置默認(rèn)值的取值范圍

    這篇文章主要介紹了MySQL建表設(shè)置默認(rèn)值的取值范圍,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 簡(jiǎn)單談?wù)凪ySQL的loose index scan

    簡(jiǎn)單談?wù)凪ySQL的loose index scan

    各種資料關(guān)于loose index scan的解釋很拗口,其實(shí)等同于oracle的index skip scan。今天我們就來(lái)詳細(xì)看看loose index scan的使用
    2015-12-12
  • Centos MySQL 5.7安裝、升級(jí)教程

    Centos MySQL 5.7安裝、升級(jí)教程

    這篇文章主要為大家詳細(xì)介紹了Centos MySQL 5.7安裝、升級(jí)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL校對(duì)規(guī)則(COLLATION)的具體使用

    MySQL校對(duì)規(guī)則(COLLATION)的具體使用

    本文主要介紹了MySQL校對(duì)規(guī)則(COLLATION)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • MySQL 在創(chuàng)建和刪除用戶時(shí)出現(xiàn)的ERROR 1396 (HY000)錯(cuò)誤問(wèn)題解決

    MySQL 在創(chuàng)建和刪除用戶時(shí)出現(xiàn)的ERROR 1396 (HY000)錯(cuò)誤問(wèn)題解決

    MySQL作為流行的數(shù)據(jù)庫(kù)系統(tǒng),涉及用戶管理時(shí)可能遇到ERROR1396錯(cuò)誤,該錯(cuò)誤發(fā)生在嘗試創(chuàng)建已存在的用戶或刪除不存在的用戶時(shí),解決方法包括檢查用戶存在性或選擇不同用戶名,此外,MySQL提供了創(chuàng)建和授權(quán)用戶的便捷工具,注意使用FLUSH PRIVILEGES命令使授權(quán)生效
    2024-09-09
  • MySql修改數(shù)據(jù)庫(kù)編碼為UTF8避免造成亂碼問(wèn)題

    MySql修改數(shù)據(jù)庫(kù)編碼為UTF8避免造成亂碼問(wèn)題

    mysql 創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定編碼很重要,很多開(kāi)發(fā)者都使用了默認(rèn)編碼,亂碼問(wèn)題可是防不勝防,下面與大家分享下通過(guò)修改數(shù)據(jù)庫(kù)默認(rèn)編碼方式為UTF8來(lái)減少數(shù)據(jù)庫(kù)創(chuàng)建時(shí)的設(shè)置,避免因粗心造成的亂碼問(wèn)題
    2013-06-06
  • mysql json格式數(shù)據(jù)查詢操作

    mysql json格式數(shù)據(jù)查詢操作

    這篇文章主要介紹了mysql json格式數(shù)據(jù)查詢操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Mysql DNS反向解析導(dǎo)致連接超時(shí)過(guò)程分析(skip-name-resolve)

    Mysql DNS反向解析導(dǎo)致連接超時(shí)過(guò)程分析(skip-name-resolve)

    從其它地方連接MySQL數(shù)據(jù)庫(kù)的時(shí)候,有時(shí)候很慢。慢的原因有可能是MySQL進(jìn)行反向DNS解析造成的,這里簡(jiǎn)單介紹下原理,需要的朋友可以參考下
    2013-03-03
  • Win7下mysql5.5安裝圖文教程

    Win7下mysql5.5安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了Win7下mysql5.5安裝的圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 五分鐘讓你快速弄懂MySQL索引下推

    五分鐘讓你快速弄懂MySQL索引下推

    ICP(Index Condition Pushdown)是在MySQL 5.6版本上推出的查詢優(yōu)化策略,把本來(lái)由Server層做的索引條件檢查下推給存儲(chǔ)引擎層來(lái)做,下面這篇文章主要給大家介紹了關(guān)于MySQL索引下推的相關(guān)資料,需要的朋友可以參考下
    2021-09-09

最新評(píng)論