MySQL索引詳解(聚集索引與非聚集索引以及數據結構)

一、索引的簡介

索引是存儲引擎快速找到記錄的一種數據結構,是數據庫中專門用於幫助用戶快速查詢數據的一種數據結構,可以幫助用戶快速尋找到需要的數據行,是數據庫性能優化中最重要的工具。

使用索引的主要目的是爲了優化查詢速度,它們包含着對數據表裏所有記錄的引用指針。簡單的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度。

二、索引的分類

 索引是在存儲引擎中實現的,也就是說不同的存儲引擎會使用不同的索引,像:MyISAM 和 InnoDB 這兩種存儲引擎使用的索引結構是 B + tree ;Memory 存儲引擎支持 Btree和hash 索引結構。

1. 單列索引    

  • 普通索引:MySQL中最基本的索引類型,沒有什麼限制,允許定義索引的列中插入重複值和空值,純粹就是爲了查詢數據更快一些;
  • 唯一索引:索引列中的值必須是唯一的,但是允許空值;
  • 主鍵索引:一種特殊的唯一索引,不允許有空值。

2. 組合索引

在表中的多個字段組合上創建的索引,遵循最左前綴原則。

最左前綴原則:使用組合索引時在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用。

回表:如果 select 所需獲得列中有大量的非索引列,索引就需要到表中找到相應的列的信息。

3. 全文索引

全文索引只能在MyISAM存儲中才能使用,而且只能在char、varchar、text 類型字段上才能使用。

三、索引的使用

 創建一個表用來做測試使用:

CREATE TABLE `user`  (
            `id` int(10) NOT NULL COMMENT '主鍵',
            `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名稱',
            `age` tinyint(3) NULL DEFAULT NULL COMMENT '年齡',
            `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

1.  普通索引

CREATE INDEX indexName ON  tableName(columnName(columnLength))

例如: create index index_name on `user`(name(10))

 列的長度可以不寫,但是創建索引時如果是blob 和 text 類型,必須指定length。

2. 唯一索引

CREATE UNIQUE INDEX indexName ON tableName(columnName(columnLength))

3.  全文索引

CREATE FULLTEXT INDEX indexName ON tableName(columnName(columnLength))

4.  聯合索引

ALTER TABLE tableName  add INDEX indexName (column1,column2,column3)

例如:ALTER TABLE `user`  add INDEX indexName (name,age,address)

5. 刪除索引

DROP INDEX indexName ON  tableName;

例如:DROP INDEX index_name ON `user`

四、索引的存儲結構

1. B Tree 和 B + Tree 的特點以及區別

  • 樹的高度一般都是2-4層,樹的高度會直接影響到 IO 讀寫的效率;
  • 如果是三層樹結構,支撐的數據量可以達到 20G ,如果是4層樹結構,支撐的數據可以達到幾十 T;
  • B Tree 和 B+ Tree最大的區別就是非葉子接覅是否存儲數據的問題:B Tree 是非葉子節點和葉子節點都會存儲數據,        B + Tree 只有葉子節點會存儲數據,而且存儲數據都是在一行上面,並且這些數據都是有指針指向的,也就是說是有順序的。

2. 非聚集索引(MyISAM)

  • 葉子節點只會存儲數據行的指針,簡單來說數據和索引不在一起,就是非聚集索引;
  • 主鍵索引和輔助索引都會存儲指針的值。

 

簡單來講:就是主鍵索引與輔助索引都是存儲的是數據的指針,都是拿着指針去數據文件中找數據。

3. 聚集索引(InnoDB)

  • 主鍵索引(聚集索引)的葉子節點會存儲數據行,也就是說數據和索引是在一起,這就是聚集索引。
  • 輔助索引只會存儲主鍵值;
  • 如果沒有主鍵,就會使用唯一索引建立聚集索引;如果沒有唯一索引,MySQL會按照一定的規則創建聚集索引。

 

簡單來講:就是主鍵索引存儲的是數據,在找到主鍵的時候就直接找到了數據,比較方便快捷;使用輔助索引的話存儲的是主鍵的值,拿到主鍵的值,再去主鍵索引中找一下數據行。

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