日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
mysql怎么找索引 mysql使用索引

MySQL——關(guān)于索引的總結(jié)

首先說說索引的 優(yōu)點(diǎn) :最大的好處無疑就是提高查詢效率。有的索引還能保證數(shù)據(jù)的唯一性,比如唯一索引。

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、東光網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為東光等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

而它的 壞處 也很明顯:索引也是文件,我們?cè)趧?chuàng)建索引時(shí),也會(huì)創(chuàng)建額外的文件,所以會(huì)占用一些硬盤空間。其次,索引也需要維護(hù),我們?cè)谠黾觿h除數(shù)據(jù)的時(shí)候,索引也需要去變化維護(hù)。當(dāng)一個(gè)表的索引多了以后,資源消耗是很大的,所以必須結(jié)合實(shí)際業(yè)務(wù)再去確定給哪些列加索引。

再說說索引的基本結(jié)構(gòu)。一說到這里肯定會(huì)脫口而出:B+樹!了解B+樹前先要了解二叉查找樹和二叉平衡樹。 二叉查找樹 :左節(jié)點(diǎn)比父節(jié)點(diǎn)小,右節(jié)點(diǎn)比父節(jié)點(diǎn)大,所以二叉查找樹的中序遍歷就是樹的各個(gè)節(jié)點(diǎn)從小到大的排序。 二叉平衡樹 :左右子樹高度差不能大于1。B+樹就是結(jié)合了它們的特點(diǎn),當(dāng)然,不一定是二叉樹。

為什么要有二叉查找樹的特點(diǎn)?? 因?yàn)椴檎倚士欤植檎以谶@種結(jié)構(gòu)下,查找效率是很快的。 那為什么要有平衡樹的特點(diǎn)呢? 試想,如果不維護(hù)一顆樹的平衡性,當(dāng)插入一些數(shù)據(jù)后,樹的形態(tài)有可能變得很極端,比如左子樹一個(gè)數(shù)據(jù)沒有,而全在右子樹上,這種情況下,二分查找和遍歷有什么區(qū)別呢?而就是因?yàn)檫@些特點(diǎn)需要去維護(hù),所以就有了上面提到的缺點(diǎn),當(dāng)索引很多后,反而增加了系統(tǒng)的負(fù)擔(dān)。

接著說B+樹。 它的結(jié)構(gòu)如下 :

可以發(fā)現(xiàn),葉子節(jié)點(diǎn)其實(shí)是一個(gè) 雙向循環(huán)鏈表 ,這種結(jié)構(gòu)的好處就是,在范圍查詢的時(shí)候,我只用找到一個(gè)數(shù)據(jù),就可以直接返回剩余的數(shù)據(jù)了。比如找小于30的,只用找到30,其余的直接通過葉子節(jié)點(diǎn)間的指針就可以找到。再說說其他特點(diǎn): 數(shù)據(jù)只存在于葉子節(jié)點(diǎn) 。當(dāng)葉子節(jié)點(diǎn)滿了,如果再添加數(shù)據(jù),就會(huì)拆分葉子節(jié)點(diǎn),父節(jié)點(diǎn)就多了個(gè)子節(jié)點(diǎn)。如果父節(jié)點(diǎn)的位置也滿了,就會(huì)擴(kuò)充高度,就是拆分父節(jié)點(diǎn),如25 50 75拆分成:25為左子樹,75為右子樹,50變成新的頭節(jié)點(diǎn),此時(shí)B+樹的高度變成了3。它們的擴(kuò)充的規(guī)律如下表,Leaf Page是葉子節(jié)點(diǎn),index Page是非葉子節(jié)點(diǎn)。

再說說B樹 ,B樹相比較B+樹,它所有節(jié)點(diǎn)都存放數(shù)據(jù),所以在查找數(shù)據(jù)時(shí),B樹有可能沒到達(dá)葉子節(jié)點(diǎn)就結(jié)束了。再者,B樹的葉子節(jié)點(diǎn)間不存在指針。

最后說說Hash索引 ,相較于B+樹,Hash索引最大的優(yōu)點(diǎn)就是查找數(shù)據(jù)快。但是Hash索引最大的問題就是不支持范圍查詢。試想,如果查詢小于30的數(shù)據(jù),hash函數(shù)是根據(jù)數(shù)據(jù)的值找到其對(duì)應(yīng)的位置,誰又知道小于30的有哪幾個(gè)數(shù)據(jù)。而B+樹正好相反,范圍查詢是它的強(qiáng)項(xiàng)。

附錄: Hash到底是啥?? 哈希中文名散列,哈希只是它的音譯。 為啥都說Hash快?? 首先有一塊哈希表(散列表),它的數(shù)據(jù)結(jié)構(gòu)是個(gè)數(shù)組,一個(gè)任意長度的數(shù)據(jù)通過hash函數(shù)都可以變成一個(gè)固定長度的數(shù)據(jù),叫hash值。然后通過hash值確定在數(shù)組中的位置,相同數(shù)據(jù)的hash值是相同的,所以我們存儲(chǔ)一個(gè)數(shù)據(jù)以后,只需O(1)的時(shí)間復(fù)雜度就可以找到數(shù)據(jù)。 那hash函數(shù)又是啥?? 算術(shù)運(yùn)算或位運(yùn)算,很多應(yīng)用里都有hash函數(shù),但實(shí)際運(yùn)算過程大不一樣。這是Java里String的hashCode方法:

publicint hashCode() {

}

還有一個(gè)問題,hash函數(shù)計(jì)算出來的hash值有可能存在碰撞,即兩個(gè)不同的數(shù)據(jù)可能存在相同的hash值,在MySQL或其他的應(yīng)用中,如Java的HashMap等,如果存在碰撞就會(huì)以當(dāng)前數(shù)組位置為頭節(jié)點(diǎn),轉(zhuǎn)變成一個(gè)鏈表。

說到這里也清楚了為啥Java中引用類型要同時(shí)重寫hashCode和equals了。兩個(gè)對(duì)象,實(shí)例就算一模一樣,它們的hash值也不相等, 為啥不相等?? 默認(rèn)的Object的hashCode方法會(huì)根據(jù)對(duì)象來計(jì)算hash值的,實(shí)例相同,但它們還是兩個(gè)不同的對(duì)象啊,所以我們重寫hashCode時(shí),最簡單的方法就是調(diào)用Object的hashCode方法,然后傳入該引用類型的屬性,讓hashCode方法只根據(jù)這幾個(gè)屬性來計(jì)算,那么實(shí)例相同的話,它們的hash值也會(huì)相等。等hashCode比較完后,如果相等再比較實(shí)例內(nèi)容,也就是equals,確保不是hash碰撞。

索引的分類

如果我們指定了一個(gè)主鍵,那么這個(gè)主鍵就是主鍵索引。如果我們沒有指定,Mysql就會(huì)自動(dòng)找一個(gè)非空的唯一索引當(dāng)主鍵。如果沒有這種字段,Mysql就會(huì)創(chuàng)建一個(gè)大小為6字節(jié)的自增主鍵。如果有多個(gè)非空的唯一索引,那么就讓第一個(gè)定義為唯一索引的字段當(dāng)主鍵,注意,是第一個(gè)定義,而不是建表時(shí)出現(xiàn)在前面的。

對(duì)于輔助索引來說,它們的B+樹結(jié)構(gòu)稍微有點(diǎn)特殊,它們的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵,而不是整個(gè)數(shù)據(jù)。所以在大部分情況下,使用輔助索引查找數(shù)據(jù),需要二次查找。但并不是所有情況都需要二次查找。比如查找的數(shù)據(jù)正好就是當(dāng)前索引字段的值,那么直接返回就行。這里提一句,B+樹的key就是對(duì)應(yīng)索引字段的內(nèi)容。

而輔助索引又有一些分類:唯一索引:不能出現(xiàn)重復(fù)的值,也算一種約束。普通索引:可以重復(fù)、可以為空,一般就是查詢時(shí)用到。前綴索引:只適用于字符串類型數(shù)據(jù),對(duì)字符串前幾個(gè)字符創(chuàng)建索引。全文索引:作用是檢測大文本數(shù)據(jù)中某個(gè)關(guān)鍵字,這也是搜索引擎的一種技術(shù)。

注意,聚集索引、非聚集索引和前面幾個(gè)索引的分類并不是一個(gè)層面上的。上面的幾個(gè)分類是從索引的作用來分析的。聚集、非聚集索引是從索引文件上區(qū)分的。主鍵索引就屬于聚集索引,即索引和數(shù)據(jù)存放在一起,葉子節(jié)點(diǎn)存放的就是數(shù)據(jù)。數(shù)據(jù)表的.idb文件就是存放該表的索引和數(shù)據(jù)。

輔助索引屬于非聚集索引,說到這也就明白了。索引和數(shù)據(jù)不存放在一起的就是非聚集索引。在MYISAM引擎中,數(shù)據(jù)表的.MYI文件包含了表的索引, 該表的 葉子節(jié)點(diǎn)存儲(chǔ)索引和索引對(duì)應(yīng)數(shù)據(jù)的指針,指向.MYD文件的數(shù)據(jù)。

索引的幾點(diǎn)使用經(jīng)驗(yàn)

經(jīng)常被查詢的字段;經(jīng)常作為條件查詢的字段;經(jīng)常用于外鍵連接或普通的連表查詢時(shí)進(jìn)行相等比較字段;不為null的字段;如果是多條件查詢,最好創(chuàng)建聯(lián)合索引,因?yàn)槁?lián)合索引只有一個(gè)索引文件。

經(jīng)常被更新的字段、不經(jīng)常被查詢的字段、存在相同功能的字段

用mysql查詢某字段是否有索引怎么做?

顯示一個(gè)表所有索引的SQL語句是:

show index from 數(shù)據(jù)庫名.表名

查看某表某一列上的索引使用下面的SQL語句:

show index from 數(shù)據(jù)庫名.表名 where column_name like '列名'

下面的SQL語句在我的數(shù)據(jù)庫上執(zhí)行成功:

show index from web.clubuser where column_name like 'user'。

MySql 索引(聚集索引,輔助索引,聯(lián)合索引,覆蓋索引..)

引入一個(gè)面試問題:

看完以下以后再回顧,會(huì)發(fā)現(xiàn)迎刃而解

Mysql 可以為每一張表設(shè)置 存儲(chǔ)引擎 這里我們只說 InnoDB 存儲(chǔ)引擎.

由于實(shí)際情況,數(shù)據(jù)頁只能按照一棵 B+樹 進(jìn)行排序, 因此每張表只能擁有一個(gè) 聚集索引(即 主鍵)。

栗子:

每個(gè)葉子節(jié)點(diǎn)的索引行中包含了一個(gè)書簽(bookmark). 該書簽是用來告訴 InnoDB存儲(chǔ)引擎哪里可以找到該索引對(duì)應(yīng)的數(shù)據(jù)行或者說 行數(shù)據(jù)! 由于InnoDB存儲(chǔ)引擎表, 是按照主鍵來構(gòu)建的, 所以 ,該書簽內(nèi)其實(shí)包含或者說指向了 數(shù)據(jù)行所對(duì)應(yīng)的聚集索引鍵

也就是說 輔助索引的 葉結(jié)點(diǎn)保存了 指向?qū)?yīng)數(shù)據(jù)的 聚集索引, 可以通過該聚集索引 找到對(duì)應(yīng)的數(shù)據(jù)行

輔助索引的存在并不影響數(shù)據(jù)在聚集索引中的組織,因?yàn)槊繌埍砩峡梢杂卸鄠€(gè)輔助索引。

當(dāng)通過輔助索引來尋找數(shù)據(jù)時(shí),InnoDB 存儲(chǔ)引擎會(huì)遍歷輔助索引并通過葉級(jí)別的指針獲得指向主鍵索引(聚集索引)的主鍵,然后再通過聚集索引找到一個(gè)完整的數(shù)據(jù)行。

例如:

聚集索引輔助索引關(guān)系:

: 又叫做組合索引 , 輔助索引的一種 , 和普通創(chuàng)建索引的方式一樣,不同的是 可以同時(shí)添加多列來作為索引項(xiàng);

從本質(zhì)上來說,聯(lián)合索引也是一課B+樹

個(gè)人理解: 所謂最左原則, 是因?yàn)?存儲(chǔ)引擎構(gòu)建組合索引時(shí) 是根據(jù)最左邊的那一列索引項(xiàng)進(jìn)行排序的 ,所以使用組合索引,必須滿足 條件中必須存在 最左邊那一列的索引項(xiàng),這樣 才可以找到對(duì)應(yīng)的索引,繼而 去尋找對(duì)應(yīng)的數(shù)據(jù)

: 又叫做 索引覆蓋,InnoDB中支持覆蓋索引,即 從輔助索引中就可以得到查詢的記錄,而不需要查詢聚集索引中的記錄。

比如 這里沒有根據(jù)最左原則使用組合索引,但是 優(yōu)化器依然進(jìn)行選擇

共勉,歡迎指導(dǎo)謝謝~

如何查看MySQL索引

查看索引

mysql show index from tblname;

mysql show keys from tblname;

· Table

表的名稱。

· Non_unique

如果索引不能包括重復(fù)詞,則為0。如果可以,則為1。

· Key_name

索引的名稱。

· Seq_in_index

索引中的列序列號(hào),從1開始。

· Column_name

列名稱。

· Collation

列以什么方式存儲(chǔ)在索引中。在MySQL中,有值‘A’(升序)或NULL(無分類)。

· Cardinality

索引中唯一值的數(shù)目的估計(jì)值。通過運(yùn)行ANALYZE TABLE或myisamchk -a可以更新?;鶖?shù)根據(jù)被存儲(chǔ)為整數(shù)的統(tǒng)計(jì)數(shù)據(jù)來計(jì)數(shù),所以即使對(duì)于小型表,該值也沒有必要是精確的?;鶖?shù)越大,當(dāng)進(jìn)行聯(lián)合時(shí),MySQL使用該索引的機(jī) 會(huì)就越大。

· Sub_part

如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。

· Packed

指示關(guān)鍵字如何被壓縮。如果沒有被壓縮,則為NULL。

· Null

如果列含有NULL,則含有YES。如果沒有,則該列含有NO。

· Index_type

用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

· Comment

mysql索引

在mysql中,索引是一種特殊的數(shù)據(jù)庫結(jié)構(gòu),由數(shù)據(jù)表中的一列或多列組合而成,可以用來快速查詢數(shù)據(jù)表中有某一特定值的記錄。

通過索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列即可。

通過索引,查詢數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢索引列。否則,數(shù)據(jù)庫系統(tǒng)將讀取每條記錄的所有信息進(jìn)行匹配。

可以把索引比作新華字典的音序表。例如,要查“庫”字,如果不使用音序,就需要從字典的 400 頁中逐頁來找。但是,如果提取拼音出來,構(gòu)成音序表,就只需要從 10 多頁的音序表中直接查找。這樣就可以大大節(jié)省時(shí)間。

因此,使用索引可以很大程度上提高數(shù)據(jù)庫的查詢速度,還有效的提高了數(shù)據(jù)庫系統(tǒng)的性能。

索引的優(yōu)缺點(diǎn)

索引有其明顯的優(yōu)勢,也有其不可避免的缺點(diǎn)。

優(yōu)點(diǎn)

索引的優(yōu)點(diǎn)如下:

1、通過創(chuàng)建唯一索引可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。

2、可以給所有的 MySQL 列類型設(shè)置索引。

3、可以大大加快數(shù)據(jù)的查詢速度,這是使用索引最主要的原因。

4、在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接。

5、在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢時(shí)也可以顯著減少查詢中分組和排序的時(shí)間

缺點(diǎn)

增加索引也有許多不利的方面,主要如下:

1、創(chuàng)建和維護(hù)索引組要耗費(fèi)時(shí)間,并且隨著數(shù)據(jù)量的增加所耗費(fèi)的時(shí)間也會(huì)增加。

2、索引需要占磁盤空間,除了數(shù)據(jù)表占數(shù)據(jù)空間以外,每一個(gè)索引還要占一定的物理空間。如果有大量的索引,索引文件可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。

3、當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。

使用索引時(shí),需要綜合考慮索引的優(yōu)點(diǎn)和缺點(diǎn)。


新聞標(biāo)題:mysql怎么找索引 mysql使用索引
URL分享:http://www.dlmjj.cn/article/doddhoj.html