- MySQL索引
- 介紹
* 使用索引的主要目的是爲了優化查詢速度
* 索引是一種特殊的文件或者叫數據結構(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏所有記錄的引用指針。更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度。
-
- 索引的分類
- 索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引
* MyISAM和InnoDB存儲引擎:只支持BTREE索引, 也就是說默認使用BTREE,不能夠更換 * MEMORY/HEAP存儲引擎:支持HASH和BTREE索引
- 索引的分類
* 單列索引:
* 普通索引:MySQL中基本索引類型,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹爲了查詢數據更快一點。
* 唯一索引:索引列中的值必須是唯一的,但是允許爲空值,
* 主鍵索引:是一種特殊的唯一索引,不允許有空值。
* 組合索引
* 在表中的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合。
* 全文索引
* 全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引。
* 空間索引:不做介紹,一般使用不到。
-
- 索引的使用
- 創建索引
- 索引的使用
- 單列索引之普通索引
CREATE
INDEX
index_name
ON
table(column(length))
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
- 單列索引之唯一索引
CREATE UNIQUE
INDEX
index_name
ON
table(column(length))
- 單列索引之全文索引
CREATE FULLTEXT INDEX
index_name
ON
table(column(length))
聯合索引
ALTER TABLE article ADD INDEX index_titme_time
(title(50),time(10))
-
-
- 刪除索引
-
DROP
INDEX
index_name
ON
table
-
- 索引的存儲結構
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
- B Tree和B+ Tree的特點與區別
* 樹的高度一般都是在2-4這個高度,樹的高度直接影響IO讀寫的次數。
* 如果是三層樹結構---支撐的數據可以達到20G,如果是四層樹結構---支撐的數據可以達到幾十T
* B Tree和B+ Tree的最大區別在於非葉子節點是否存儲數據的問題。B Tree是非葉子節點和葉子節點都會存儲數據。而B+ Tree只有葉子節點纔會存儲數據,而且存儲的數據都是在一行上,而且這些數據都是有指針指向的,也就是由順序的。
- 非聚集索引
* 葉子節點只會存儲數據行的指針,簡單來說數據和索引不在一起,就是非聚集索引。
* 主鍵索引和輔助索引都會存儲指針的值
- 聚集索引(InnoDB)
* 主鍵索引(聚集索引)的葉子節點會存儲數據行,也就是說數據和索引是在一起,這就是聚集索引。
* 輔助索引只會存儲主鍵值
* 如果沒有沒有主鍵,則使用唯一索引建立聚集索引;如果沒有唯一索引,MySQL會按照一定規則創建聚集索引。
-
- 使用索引的注意事項
- 儘量創建組合索引(組合索引其實會默認按照最左前綴原則幫我們創建多組索引)
組合索引(id,name,sex)
- 索引最左前綴原則
- 索引覆蓋:要查詢的列,也要使用索引覆蓋住