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