資料庫MySQL02索引

2021-09-22 12:50:57 字數 3841 閱讀 9189

在關聯式資料庫中,索引是一種單獨的、物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。

索引提供指向儲存在表的指定列中的資料值的指標,然後根據您指定的排序順序對這些指標排序。資料庫使用索引以找到特定值,然後順指標找到包含該值的行。這樣可以使對應於表的sql語句執行得更快,可快速訪問資料庫表中的特定資訊。

當表中有大量記錄時,若要對錶進行查詢,第一種搜尋資訊方式是全表搜尋,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟i/o操作;第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過儲存在索引中的rowid(相當於頁碼)快速找到表中對應的記錄。

索引就像書籍的目錄,當我們要搜尋想看的內容的時候,先從目錄搜尋,然後找到內容的頁數,再翻到相應的頁去檢視就可以了,比我們一頁頁翻著查詢要快很多,所以索引的核心就是加快sql的查詢。

當我們表中的資料量上萬,幾十萬甚至上百萬的時候,乙個sql查詢所花費的時間就會很長,那麼此時就需要用到索引來加速sql查詢,具體內容請看下面對索引的描述。

但由於索引也是需要儲存成索引檔案的,因此對於索引的使用,也涉及大量的磁碟i/o操作,如果索引建立過多,使用不當,會造成sql查詢時,進行大量無用的磁碟i/o操作,降低了sql查詢效率,適得其反,因此掌握索引的執行過程和實現原理,非常重要!

索引是建立在表上的,是對資料庫表中一列或者多列的值進行排序的一種結果。索引的核心是提高查詢的速度!

索引的優點: 提高查詢效率

索引的缺點: 索引並非越多越好,過多的索引會導致cpu使用率居高不下,由於資料的改變,會造成索引文 件的改動,過多的磁碟i/o造成cpu負荷太重

1.普通索引:沒有任何限制條件,可以給任何型別的字段建立普通索引

2.唯一性索引:使用unique修飾的字段,值不能夠重複,主鍵索引就隸屬於唯一性索引

3.主鍵索引:使用primary key修飾的字段會自動建立索引

4.單列索引:在乙個欄位上建立索引

5.多列索引:在表的多個欄位上建立索引

6.全文索引:使用fulltext引數可以設定全文索引,只支援cahr,varchar和text型別的字段上,常用於資料量較大的字串型別上,可以提高查詢速度;只有myisam儲存引擎支援。

建立表的時候指定索引字段:

create table index1(id int,

name varchar(20),

*** enum(『male』, 『female』),

index(id));

在已經建立的表上新增索引:

create [unique|fulltext|spatial] index 索引名

on 表名 (屬性名 [asc | desc]);

刪除索引:

drop index 索引名 on 表名;

***用explain檢視一下上面sql語句的執行計畫

explain select score from student where name=『liu』\g

mysql支援兩種索引,一種的b-樹索引,一種是雜湊索引,大家知道,b-樹和雜湊表在資料查詢時的效率是非常高的。

這裡我們主要討論一下mysql innodb儲存引擎,基於b-樹(但實際上mysql採用的是b+樹結構)的索引結構。

b-樹是一種m階平衡樹,葉子節點都在同一層,由於每乙個節點儲存的資料量比較大,索引整個b-樹的層數是非常低的,基本上不超過三層。

由於磁碟的讀取也是按block塊操作的(記憶體是按page頁面操作的),因此b-樹的節點大小一般設定為和磁碟塊大小一致,這樣乙個b-樹節點,就可以通過一次磁碟i/o把乙個磁碟塊的資料全部儲存下來,所以當使用b-樹儲存索引的時候,磁碟i/o的操作次數是最少的(mysql的讀寫效率,主要集中在磁碟i/o上)。

那麼mysql最終為什麼要採用b+樹儲存索引結構呢,那麼看看b-樹和b+樹在儲存結構上有什麼不同?

b-樹的每乙個節點,存了關鍵字和對應的資料位址,而b+樹的非葉子節點只存關鍵字,不存資料位址。因此b+樹的每乙個非葉子節點儲存的關鍵字是遠遠多於b-樹的,b+樹的葉子節點存放關鍵字和資料,因此,從樹的高度上來說,b+樹的高度要小於b-樹,使用的磁碟i/o次數少,因此查詢會更快一些。

b-樹由於每個節點都儲存關鍵字和資料,因此離根節點進的資料,查詢的就快,離根節點遠的資料,查詢的就慢;b+樹所有的資料都存在葉子節點上,因此在b+樹上搜尋關鍵字,找到對應資料的時間是比較平均的,沒有快慢之分。

在b-樹上如果做區間查詢,遍歷的節點是非常多的;b+樹所有葉子節點被連線成了有序鍊錶結構,因此做整表遍歷和區間查詢是非常容易的。

雜湊索引當然是由雜湊表實現的,雜湊表對資料並不排序,因此不適合做區間查詢,效率非常低,需要搜尋整個雜湊表結構。

b-樹的結構圖

b+樹的結構圖如下:

主鍵索引,輔助索引,聚集索引,非聚集索引:

myisam儲存引擎 - 主鍵索引

myisam引擎使用b+樹作為索引結構,葉節點的data域存放的是資料記錄的位址。下圖是myisam主鍵索引的原理圖:

myisam儲存引擎 - 輔助索引

在myisam中,主索引和輔助索引(secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複,如果給其它字段建立輔助索引,結構圖如下:

innodb儲存引擎 - 主鍵索引

innodb儲存引擎的主鍵索引,葉子節點中,索引關鍵字和資料是在一起存放的,如圖:

innodb儲存引擎 - 輔助索引

innodb的輔助索引,葉子節點上存放的是索引關鍵字和對應的主鍵,如圖:

輔助索引的b+樹,先根據關鍵字找到對應的主鍵,再去主鍵索引樹上找到對應的行記錄資料。

從索引樹上可以看到,innodb的索引關鍵字和資料都是在一起存放的,體現在磁碟儲存上,例如建立乙個user表,在磁碟上只儲存兩種檔案,user.frm(儲存表的結構),user.ibd(儲存索引和資料)。

innodb的索引樹葉節點包含了完整的資料記錄,這種索引叫做聚集索引。因為innodb的資料檔案本身要按主鍵聚集,所以innodb要求表必須有主鍵(myisam可以沒有),如果沒有顯式指定,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。

從前面的內容可以看到,索引固然很好,但是給表建立過多的索引,效率反而會降低,因此在給表設計索引的時候,需要遵循以下的設計原則:

1.給區分度高的字段建立索引

2.給經常需要排序,分組和多表聯合操作的字段建立索引

3.給常作為查詢條件的字段建立索引

4.索引的數目不宜過多

5.使用資料量少的索引(如字首索引,主要針對字串型別,字串型別盡量建立字首索引)

6.對於多列索引,優先指定最左邊的列集

7.刪除不再使用或者很少使用的索引

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

MySql 02 命令列操作

啟動mysql服務 net start mysql登入 已經設定過 mysql u root p123456修改使用者密碼 update mysql.user set authentication string password 123456 where user root and host loc...

mysql更新索引庫 Mysql資料庫索引增刪改查

一.索引的作用 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。在資料量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當資料量和訪問量劇增的...