MySQL中的索引

2021-08-25 19:37:02 字數 1747 閱讀 2090

mysql中普遍使用b+tree做索引,但在實現上又分為聚簇索引

非聚簇索引

所謂聚簇索引,就是指主索引檔案和資料檔案為同一份檔案,聚簇索引主要用在innodb儲存引擎中。在該索引實現方式中b+tree的葉子節點上的data就是資料本身,key為主鍵,如果是一般索引的話,data便會指向對應的主索引,如下圖所示:

在b+tree的每個葉子節點增加乙個指向相鄰葉子節點的指標,就形成了帶有順序訪問指標的b+tree。做這個優化的目的是為了提高區間訪問的效能,例如圖4中如果要查詢key為從18到49的所有資料記錄,當找到18後,只需順著節點和指標順序遍歷就可以一次性訪問到所有資料節點,極大提到了區間查詢效率。

非聚簇索引就是指b+tree的葉子節點上的data,並不是資料本身,而是資料存放的位址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。主要用在myisam儲存引擎中,如下圖:

非聚簇索引比聚簇索引多了一次讀取資料的io操作,所以查詢效能上會差。

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟i/o操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。

簡單點說說記憶體讀取,記憶體是由一系列的儲存單元組成的,每個儲存單元儲存固定大小的資料,且有乙個唯一位址。當需要讀記憶體時,將位址訊號放到位址匯流排上傳給記憶體,記憶體解析訊號並定位到儲存單元,然後把該儲存單元上的資料放到資料匯流排上,回傳。

寫記憶體時,系統將要寫入的資料和單元位址分別放到資料匯流排和位址匯流排上,記憶體讀取兩個匯流排的內容,做相應的寫操作。

記憶體訪問效率,跟次數有關,先讀取a資料還是後讀取a資料不會影響訪問效率。而磁碟訪問就不一樣了,磁碟i/o涉及機械操作。磁碟是由大小相同且同軸的圓形碟片組成,磁碟可以轉動(各個磁碟須同時轉動)。磁碟的一側有磁頭支架,磁頭支架固定了一組磁頭,每個磁頭負責訪問乙個磁碟的內容。磁頭不動,磁碟轉動,但磁臂可以前後動,用於讀取不同磁軌上的資料。磁軌就是以碟片為中心劃分出來的一系列同心環(如圖示紅那圈)。磁軌又劃分為乙個個小段,叫扇區,是磁碟的最小儲存單元。

磁碟讀取時,系統將資料邏輯位址傳給磁碟,磁碟的控制電路會解析出實體地址,即哪個磁軌哪個扇區。於是磁頭需要前後移動到對應的磁軌,消耗的時間叫尋道時間,然後磁碟旋轉將對應的扇區轉到磁頭下,消耗的時間叫旋轉時間。所以,適當的操作順序和資料存放可以減少尋道時間和旋轉時間。

為了儘量減少i/o操作,磁碟讀取每次都會預讀,大小通常為頁的整數倍。即使只需要讀取乙個位元組,磁碟也會讀取一頁的資料(通常為4k)放入記憶體,記憶體與磁碟以頁為單位交換資料。因為區域性性原理認為,通常乙個資料被用到,其附近的資料也會立馬被用到。

b-tree:如果一次檢索需要訪問4個節點,資料庫系統設計者利用磁碟預讀原理,把節點的大小設計為乙個頁,那讀取乙個節點只需要一次i/o操作,完成這次檢索操作,最多需要3次i/o(根節點常駐記憶體)。資料記錄越小,每個節點存放的資料就越多,樹的高度也就越小,i/o操作就少了,檢索效率也就上去了。

MySQL索引,MySQL中索引的限制?

mysql中索引的限制 1 myisam儲存引擎引鍵的長度綜合不能超過1000位元組 2 blob和text型別的列只能建立字首索引 3 mysql目前不支援函式索引 4 使用!或者 的時候mysql不能使用索引 5 過濾字段使用了函式運算的時候如 abs key sum key 的時候mysql無...

mysql中的索引

mysql中的索引 什麼是索引?索引是對資料庫中某乙個表的資料進行排序,這種排序並不是真正的對錶中資料按照大小排序,而是另外再建立乙個索引檔案來存放包含btree資料結構,在資料結構中根據索引欄位的值排序,資料結構的值包括 索引欄位的值和索引對應資料行的位址。索引查詢就是先查詢這個索引檔案來獲得資料...

MySql中的索引

索引就是資料庫內部對某個表的所有資料預先進行的某種排序,以便於後面的快速查詢。作用 可以極大的加快資料的查詢速度 通常所謂的建立索引,就是指定乙個表的某個或某些字段作為 索引資料字段 就可以了,形式為 索引型別 要建立的索引的欄位名 create table if notexists 表名 欄位1,...