mysql的索引介绍_1
生活随笔
收集整理的這篇文章主要介紹了
mysql的索引介绍_1
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
其實(shí)數(shù)據(jù)庫(kù)索引對(duì)于我們做數(shù)據(jù)檢索的時(shí)候,是有很大的幫助的,提高我們的檢索效率,有些同學(xué)會(huì)這么認(rèn)為,有人說建索引會(huì)提高效率,那把所有的列都建成索引就完事了嗎,這個(gè)不是這樣的,所以索引肯定是有自己的有缺點(diǎn)的,我們先看看索引的優(yōu)點(diǎn)有哪些為什么要?jiǎng)?chuàng)建索引呢?這是因?yàn)閯?chuàng)建索引可以大大提升系統(tǒng)的查詢性能,索引要解決最根本的問題,就是提高查詢的性能,以及效率,這是他存在的唯一的一個(gè)條件1. 通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性其實(shí)最后唯一性最后也會(huì)映射到查詢效率上,也就是我們?cè)诓槟骋恍袛?shù)據(jù)的時(shí)候,如果你用的條件是一個(gè)主鍵,他所查詢的效率,就比查詢非主鍵的效率要高,為什么呢,其實(shí)我上午講的內(nèi)容已經(jīng)說出來了,咱們說MYSQL當(dāng)中會(huì)有自動(dòng)創(chuàng)建聚合索引的能力,還記得嗎,聚合索引聚合的是什么,先找他的主鍵,如果有主鍵把主鍵聚合進(jìn)來,如果沒有主鍵,找唯一性約束的,可以生成一個(gè)唯一的索引鍵,那說明只要我用主鍵查,就一定會(huì)走索引,那索引里面的值對(duì)外換算成什么呢,其實(shí)就是你這個(gè)數(shù)據(jù)在物理磁盤上確切的存的物理位置,那我是不是可以直接去磁盤拿到這個(gè)數(shù)據(jù),所以主鍵查詢也是索引查詢,以后你們到公司的時(shí)候,特別是新項(xiàng)目在設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候,DBA肯定會(huì)說這么一句話,你們?cè)趯慡QL語句的時(shí)候,如果有主鍵作為條件的一定要用主鍵作為條件,其實(shí)大家知道,但是他還是得啰嗦一句,足以證明主鍵和不用主鍵有很大的差異的2. 可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因3. 可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方法有特別的意義,一般發(fā)現(xiàn)我們?cè)诮ㄍ怄I的時(shí)候,外鍵所參照的列必須是一個(gè)主鍵,還記得嗎,外鍵鎖參照的列,不是外鍵列本身啊,是外鍵所參照的這個(gè)列,必須得是一個(gè)主鍵,所以正是因?yàn)橛羞@樣一個(gè)約束在里面,那他在做表與表之間的連接的時(shí)候4. 在使用分組和排序字句進(jìn)行數(shù)據(jù)檢索的時(shí)候,同樣可以顯著減少查詢中分組和排序的時(shí)間,前四點(diǎn)都是圍繞這性能,5. 通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能,這個(gè)優(yōu)化隱藏器是什么呢,就是我們看的架構(gòu)圖里面的,解析器對(duì)他進(jìn)行優(yōu)化,優(yōu)化我們的執(zhí)行計(jì)劃,他肯定會(huì)緩存的,這樣下回可以直接去拿這個(gè)東西了,所以這也是他的優(yōu)點(diǎn)所以以上5點(diǎn)都是為了優(yōu)化性能的
也許會(huì)有人問,增加索引有如此多的優(yōu)點(diǎn),為什么不對(duì)表中的每一個(gè)列創(chuàng)建一個(gè)索引呢?這個(gè)問題問的非常好,既然是這樣,那我們就都建索引唄,這種想法有其合理性,然而也有片面性,雖然索引有許多優(yōu)點(diǎn),但是為表中的每一個(gè)列增加索引,是非常不明智的,這是因?yàn)?增加索引,會(huì)有許多不利的方面,所以索引是把雙刃劍他并不是百分百好的,他還有自己的缺點(diǎn)1. 創(chuàng)建索引和維護(hù)索引需要耗費(fèi)時(shí)間,誰維護(hù),首先這個(gè)索引一旦創(chuàng)建了,對(duì)于索引里的信息,并不是我們?nèi)ゾS護(hù)的,而是由數(shù)據(jù)庫(kù)去維護(hù)的,那也就意味著,如果索引的信息會(huì)經(jīng)常的變更,數(shù)據(jù)庫(kù)就需要對(duì)索引進(jìn)行維護(hù),維護(hù)了肯定耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加,或者隨著索引量的增加而增加,我不知道你們有沒有了解過B-TREE,Balance Tree,你會(huì)發(fā)現(xiàn)Balance Tree往里面放數(shù)據(jù)可容易了,但是一旦你把某個(gè)節(jié)點(diǎn)刪掉了,他想重新歸納這棵樹的時(shí)候非常的麻煩,麻煩不亞于把這棵樹打散了再建一個(gè)新的樹,那么這個(gè)過程就是維護(hù)索引,為什么這么說呢,MYQL里面對(duì)于索引的存儲(chǔ)結(jié)構(gòu),采用的就是Balance Tree,紅黑樹,明白我的意思嗎,所以說他對(duì)于索引的維護(hù)是比較耗時(shí)的2. 索引需要占用物理空間,除了數(shù)據(jù)表占用數(shù)據(jù)空間之外,每一個(gè)索引還需要占一定的物理空間,如果要建立聚簇索引那么需要的空間更大,也就是說索引一旦建立完了,索引是存在內(nèi)存當(dāng)中還是存在磁盤當(dāng)中,一定是存在磁盤當(dāng)中的,只要借助這個(gè)機(jī)會(huì)說一個(gè)東西,如果我的MSYQL用的是InnoDB,在我的MYSQL里存的數(shù)據(jù)是什么,data里面,這是你所有的庫(kù)咱們就找一個(gè)test這庫(kù),這三個(gè)文件看到了嗎,frm這個(gè)哪來的,如果你要是沒換引擎,注意看有一個(gè)叫ibd的文件,這個(gè)ibd文件是什么呢,是做數(shù)據(jù)存儲(chǔ)時(shí)的數(shù)據(jù)文件,你看看這些都是ibd,對(duì)于他也有一個(gè)frm,這是表結(jié)構(gòu)的,兩個(gè)引擎產(chǎn)生的文件都是一樣的,然后這里有一個(gè)ibdata1,這是什么意思啊,我們用MYSQL做主從搭建的時(shí)候,你們有沒有遇到這個(gè)問題,就是MYSQL的集群搭建,導(dǎo)致主庫(kù)的數(shù)據(jù)不能復(fù)制到從庫(kù)里,數(shù)據(jù)不同步,然后看slave的狀態(tài),這種問題是及其容易產(chǎn)生的,你在從庫(kù)里面寫了插了一條數(shù)據(jù),然后你在主庫(kù)里又寫了一條數(shù)據(jù),其實(shí)現(xiàn)在主庫(kù)和從庫(kù)已經(jīng)不匹配了,你在從庫(kù)里插入一條,所以我們主從搭建的時(shí)候,插入以主庫(kù)為主,查詢以從庫(kù)為主,否則會(huì)有數(shù)據(jù)同步不過來,那怎么解決這個(gè)問題啊,有人說我重新裝兩個(gè)MYSQL,大家注意,你首先要把從庫(kù)的數(shù)據(jù)給刪掉,然后取主庫(kù)的配置目錄下,把.log的文件,做數(shù)據(jù)遷移,把所有的.log刪掉,把ibdata刪掉,這里記錄的是什么呢,就是當(dāng)前表的表空間的定義,也就是MYSQL的InnoDB在做數(shù)據(jù)存儲(chǔ)的時(shí)候,這里面放的是公用表空間,我們所關(guān)注的是什么呢,是這里面的ibd文件,通過我講完這一節(jié),你現(xiàn)在看這些文件能看懂了吧看擴(kuò)張名就懂了吧,能看懂吧,就是這個(gè)意思啊,能看懂說明目的就達(dá)到了,這就提到這里,接下來我們繼續(xù)往下來
什么樣的字段適合創(chuàng)建索引呢?1. 索引是建立在數(shù)據(jù)庫(kù)表中的某些列的上面,因此在創(chuàng)建索引的時(shí)候,應(yīng)該仔細(xì)考慮哪些列上可以創(chuàng)建索引,在哪些列上不可以創(chuàng)建索引一般來說,應(yīng)該在這些列上創(chuàng)建索引,例如:1. 在經(jīng)常需要搜索的列上,可以加快搜索的速度,就是這個(gè)列會(huì)經(jīng)常當(dāng)做一個(gè)查詢條件,這是第一點(diǎn)啊2. 在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu),這句話什么意思呢,就是能用主鍵去查,就一定要用主鍵去查3. 在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接查詢,外鍵給他建立一個(gè)索引,其實(shí)這個(gè)問題你知道就可以,等你未來工作你還會(huì)發(fā)現(xiàn),如果你做的是一個(gè)互聯(lián)網(wǎng)項(xiàng)目,其實(shí)我們表和表之間是有外鍵的,絕對(duì)不會(huì)建立外鍵約束,為什么 不會(huì)建立外鍵約束,他最終是為了建分庫(kù)分表,外鍵有這樣的一個(gè)特點(diǎn),我A,B分庫(kù)又分表了,很有可能這兩個(gè)表不在一個(gè)庫(kù)里面,外鍵就會(huì)報(bào)錯(cuò)了,外鍵找不到,這兩個(gè)表會(huì)有外鍵約束的,這樣就比較靈活了4. 在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序了,其指定的范圍是連續(xù)的,這個(gè)特別有意思,MYSQL底層是用一個(gè)B-Tree,Tree樹的特點(diǎn)就是查詢快,正是因?yàn)闃涞奶攸c(diǎn),那你完全可以對(duì)里面的索引進(jìn)行排序了,那你對(duì)這個(gè)排序了,把這個(gè)列建一個(gè)索引,換一個(gè)來說,因?yàn)樗怯行虻?起碼它會(huì)少了哪個(gè)環(huán)節(jié),把所有的數(shù)據(jù)都拿出來,樹是支持排序5. 在經(jīng)常需要排序的列上創(chuàng)建索引,其實(shí)跟她是一個(gè)道理,還是那句話,利用樹排序的道理,什么叫排序的列上,order by上6. 在經(jīng)常使用where子句中的列上創(chuàng)建索引,加快查詢的判斷條件建立索引,一般按照select的where條件來建立,比如select的條件是where f1 and f2,那么我們?nèi)绻谧侄蝔1和字段f2上建立索引也是沒用的,只有在字段f1和字段f2同時(shí)建立索引才是有用的,這句話什么意思,兩個(gè)都有索引才有提升,只建一個(gè)f1或者只建一個(gè)f2是沒用的,其實(shí)這個(gè)很好理解,他考慮f1不可能不考慮f2,我們需要記得是什么啊,就像我剛剛說的這個(gè),都是我們需要記住的,以便于你能更靈活的建立索引,你得知道索引的特點(diǎn),這就是索引的一個(gè)特點(diǎn)
?
總結(jié)
以上是生活随笔為你收集整理的mysql的索引介绍_1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的事物隔离级别
- 下一篇: mysql的索引介绍_2