數據庫的索引原理???

使用索引很簡單的。只要能寫創建表單語句。就能寫創建索引的語句。

當然我的本科的侷限性:就是加索引能失敗查詢變快。。。變快。變快

 

特別需要說明的是,MySQL支持諸多存儲引擎,而各種存儲引擎對索引的支持也各不相同,因此MySQL數據庫支持多種索引類型,BTree索引,哈希索引,全文索引。因爲這是平常使用MySQL時主要打交道的索引,至於哈希索引和全文索引本文暫不討論。

MySQL官方對索引的定義爲:索引(Index)是幫助MySQL高效獲取數據的數據結構。提取句子主幹,就可以得到索引的本質:索引是數據結構

爲什麼要給表加上主鍵???

主流的RDMBS都是把平衡樹當做數據庫默認的索引數據結構。當然也有的是哈希桶作爲索引的。。

我自己理解的就是:不同的引擎的話,索引是不同的。

我們平時建表的時候都會爲表加上主鍵,在某些關係數據中,如果建表時不指定主鍵,數據庫會拒絕建表

的語句的執行。事實上,一個加了主鍵的表,並不能稱之爲表,一個沒加主鍵的表,她的數據會無序的放置在磁盤‘存儲器上,

一行一行的排列的很整齊,和我認知中的表很接近,如果這時候加上了主鍵,那麼表在磁盤上的存儲結構就有整齊排列結構變成了樹狀結構。也就是上面的平衡樹。整個表就變成了一個聚集索引,這就是爲什麼一個表只能有一個主鍵,一個表只能有一個聚集索引,因爲主鍵的作用就是把表的數據格式轉換成平衡樹的格式放置。

 

講完聚集索引,接下來我們就聊一聊非聚集索引,也就是我們平時經常提起和使用的常規索引。

非聚集索引和聚集索引一樣。同樣是採用非平衡樹作爲索引的數據結構的。索引結構中個節點的值來自於表中

的索引字段,假如給user表的name字段加上索引,那麼索引就是有name字段的值構成,在數據改變時,DBNS需要一直維護索引結構的正確性,如果給表中的多個字段加上索引,那麼就會出現多個獨立的索引結構,每個索引(非聚集聚集)就不互相關聯了。每次給字段建一個新索引,字段中數據就會被複制一份出來。用於生成索引。因此,給表添加索引,就會添加表的體積。佔用磁盤存儲空間。

       非聚集索引和聚集索引的區別在於:通過聚集索引可以查到需要查找的數據,而通過非聚集索引可以查到記錄對應的主鍵值,在使用主鍵的值通過聚集索引查找需要的數據。

  不管以任何方式查詢表,最終都會利用主鍵通過聚集索引來定位到數據,聚集索引(主鍵)是通往真實數據真實數據的唯一途徑。

 

-----------------這裏我們介紹的就是爲什麼添加索引後,效率會高很多-------------------

B數又叫B-樹,它就是一種平衡多路查找數。。

這裏我們就簡單的去描述一下B數的主要特點。。

所有的葉子節點必須在同一層次,也就是他們具有相同的深度。

在一個節點中,第n個子數中的所有key,小於這個節點第n個key.大於n-1的key。。就是這樣的。

由於B_tree的特性,在B-tree中安key解鎖數據的算法非常直觀:如果找到則返回對應的節點的data,否則對相應區間的指針指向的節點遞歸進行查找,直到找到節點或找到null指針,前者查找成功,後者查找失敗,B-tree上查找算法的僞代碼的如下:

根據上面的性質的話,我們對於一個度爲d的B-tree,設其索引N個key,則其樹的高上面爲logd((N+1)/2),解鎖一個key.其查找節點個數的建進度複雜度O(logdN).這點。B-tree是一個 非常有效率的索引數據結構。

另外, 由於插入刪除新的數據會破壞B-tree的性質,在插入刪除時,需要對數進行一個分裂,合併,轉移等操作以保持

B-tree性質。

這裏的話,b-tree有很多變種,其中最常見的就是b+tree,比如mysql就普遍使用B+tree實現其索引結構。

這裏就是每個節點不存儲data,只儲存key.

葉子節點不存儲指針。

 

 

。。。。。。。。這裏我們對數據庫 的優化,談談自己的看法吧。。。。。。。。。。。。

sql的優化就是結構優化和查詢語句的優化:(就是簡單點的話,就是避免全表掃描)

1.對查詢進行優化,應儘量避免的是全表掃描,首先應考慮的在where 即order by設計的列上建立索引。

這裏我們就簡單的說三條可以不?

應儘量避免在where字句中對字段進行null值判斷,否則將導致引擎方式使用索引而進行全表掃描。

應儘量避免使用where語句中使用or來連接條件。否則將導致引擎放棄 使用索引而進行全表掃描。

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章