共計 4315 個字符,預計需要花費 11 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章主要介紹給 Myql 創建索引的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
為了提升 Mysql 的性能我們可以創建索引,來提升 Mysql 的搜索速度,還可以緩解對 Mysql 數據庫的壓力,下面我們來說說關于 Mysql 的索引和一些高級用法。
所有 MySQL 列類型可以被索引。根據存儲引擎定義每個表的最大索引數和最大索引長度。
所有存儲引擎支持每個表至少 16 個索引,總索引長度至少為 256 字節。大多數存儲引擎有更高的限制。
索引的存儲類型目前只有兩種(btree 和 hash),具體和存儲引擎模式相關:
MyISAM btree
InnoDB btree
MEMORY/Heap hash,btree
默認情況 MEMORY/Heap 存儲引擎使用 hash 索引
MySQL 的 btree 索引和 hash 索引的區別
hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像 btree(B-Tree) 索引需要從根節點到枝節點,最后才能訪問到頁節點這樣多次的 IO 訪問,所以 hash 索引的查詢效率要遠高于 btree(B-Tree) 索引。
雖然 hash 索引效率高,但是 hash 索引本身由于其特殊性也帶來了很多限制和弊端,主要有以下這些。
(1)hash 索引僅僅能滿足 =,=,IN,IS NULL 或者 IS NOT NULL 查詢,不能使用范圍查詢。
由于 hash 索引比較的是進行 hash 運算之后的 hash 值,所以它只能用于等值的過濾,不能用于基于范圍的過濾,因為經過相應的 hash 算法處理之后的 hash 值的大小關系,并不能保證和 hash 運算前完全一樣。
(2)hash 索引無法被用來避免數據的排序操作。
由于 hash 索引中存放的是經過 hash 計算之后的 hash 值,而且 hash 值的大小關系并不一定和 hash 運算前的鍵值完全一樣,所以數據庫無法利用索引的數據來避免任何排序運算;
(3)hash 索引不能利用部分索引鍵查詢。
對于組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合并后再一起計算 hash 值,而不是單獨計算 hash 值,所以通過組合索引的前面一個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用。
(4)hash 索引在任何時候都不能避免表掃描。
前面已經知道,hash 索引是將索引鍵通過 hash 運算之后,將 hash 運算結果的 hash 值和所對應的行指針信息存放于一個 hash 表中,由于不同索引鍵存在相同 hash 值,所以即使取滿足某個 hash 鍵值的數據的記錄條數,也無法從 hash 索引中直接完成查詢,還是要通過訪問表中的實際數據進行相應的比較,并得到相應的結果。
(5)hash 索引遇到大量 hash 值相等的情況后性能并不一定就會比 B -Tree 索引高。
對于選擇性比較低的索引鍵,如果創建 hash 索引,那么將會存在大量記錄指針信息存于同一個 hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表數據的訪問,而造成整體性能低下
B-Tree 索引是 MySQL 數據庫中使用最為頻繁的索引類型,除了 Archive 存儲引擎之外的其他所有的存儲引擎都支持 B-Tree 索引。不僅僅在 MySQL 中是如此,實際上在其他的很多數據庫管理系統中 B -Tree 索引也同樣是作為最主要的索引類型,這主要是因為 B-Tree 索引的存儲結構在數據庫的數據檢 索中有非常優異的表現。
一般來說,MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結構來存儲的,也就是所有實際需要的數據都存放于 Tree 的 Leaf Node,而且到任何一個 Leaf Node 的最短路徑的長度都是完全相同的,所以我們大家都稱之為 B-Tree 索引當然,可能各種數據庫(或 MySQL 的各種存儲引擎)在存放自己的 B-Tree 索引的時候會對存儲結構稍作改造。
如 Innodb 存儲引擎的 B-Tree 索引實際使用的存儲結構實際上是 B+Tree,也就是在 B-Tree 數據結構的基礎上做了很小的改造,在每一個 Leaf Node 上面出了存放索引鍵的相關信息之外,還存儲了指向與該 Leaf Node 相鄰的后一個 LeafNode 的指針信息,這主要是為了加快檢索多個相鄰 Leaf Node 的效率考慮。
在 Innodb 存儲引擎中,存在兩種不同形式的索引,一種是 Cluster 形式的主鍵索引(Primary Key),另外一種則是和其他存儲引擎(如 MyISAM 存儲引擎)存放形式基本相同的普通 B-Tree 索引,這種索引在 Innodb 存儲引擎中被稱為 Secondary Index。
在 Innodb 中如果通過主鍵來訪問數據效率是非常高的,而如果是通過 Secondary Index 來訪問數據的話,Innodb 首先通過 Secondary Index 的相關信息,通過相應的索引鍵檢索到 Leaf Node 之后,需要再通過 Leaf Node 中存放的主鍵值再通過主鍵索引來獲取相應的數據行。
MyISAM 存儲引擎的主鍵索引和非主鍵索引差別很小,只不過是主鍵索引的索引鍵是一個唯一且非空 的鍵而已。而且 MyISAM 存儲引擎的索引和 Innodb 的 Secondary Index 的存儲結構也基本相同,主要的區別只是 MyISAM 存儲引擎在 Leaf Nodes 上面出了存放索引鍵信息之外,
再存放能直接定位到 MyISAM 數據文件中相應的數據行的信息(如 Row Number),但并不會存放主鍵的鍵值信息。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。
MySQL 索引類型包括:
(1)普通索引,這是最基本的索引,它沒有任何限制。它有以下幾種創建方式:
— 創建索引
CREATE INDEX indexName ON mytable(username(10)); — 單列索引
— CREATE INDEX indexName ON mytable(username(10),city(10)); — 組合索引
— indexName 為索引名,mytable 表名,username 和 city 為列名,10 為前綴長度,即索引在該列從最左字符開始存儲的信息長度,單位字節
— 如果是 CHAR,VARCHAR 類型,前綴長度可以小于字段實際長度;如果是 BLOB 和 TEXT 類型,必須指定 前綴長度,下同。
— 修改表結構來創建索引
ALTER TABLE mytable ADD INDEX indexName (username(10));
— ALTER TABLE mytable ADD INDEX indexName (username(10),city(10));
— 此處 indexName 索引名可不寫,系統自動賦名 username,username_2,username_3,…
— 創建表的時候直接指定
CREATE TABLE mytable(
id INT,
username VARCHAR(16),
city VARCHAR(16),
age INT,
INDEX indexName (username(10))– INDEX indexName (username(10),city(10))
);
— 此處 indexName 索引名同樣可以省略
(2)唯一索引,它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式(僅僅在創建普通索引時關鍵字 INDEX 前加 UNIQUE):
— 創建索引
CREATE UNIQUE INDEX indexName ON mytable(username(10));
— 修改表結構來創建索引
ALTER TABLE mytable ADD UNIQUE INDEX indexName (username(10));– 也可簡寫成 ALTER TABLE mytable ADD UNIQUE indexName (username(10));
— 創建表的時候直接指定
CREATE TABLE mytable(
id INT,
username VARCHAR(16),
city VARCHAR(16),
age INT,
UNIQUE INDEX indexName (username(10)) — 也可簡寫成 UNIQUE indexName (username(10))
);
(3)主鍵索引,它是一種特殊的唯一索引,不允許有空值。在建表的時候同時創建的主鍵即為主鍵索引
主鍵索引無需命名,一個表只能有一個主鍵。主鍵索引同時可是唯一索引或者全文索引,但唯一索引或全文索引不能共存在同一索引:
— 修改表結構來創建索引 ALTER TABLE mytable ADD PRIMARY KEY (id);
— 創建表的時候直接指定 CREATE TABLE mytable(
id INT,
username VARCHAR(16),
city VARCHAR(16),
age INT,PRIMARY KEY(id)
);
(4)全文索引,InnoDB 存儲引擎不支持全文索引:
— 創建索引 CREATE FULLTEXT INDEX indexName ON mytable(username(10));
— 修改表結構來創建索引 ALTER TABLE mytable ADD FULLTEXT INDEX indexName (username(10));
— 也可簡寫成 ALTER TABLE mytable ADD FULLTEXT indexName (username(10));
— 創建表的時候直接指定 CREATE TABLE mytable(
id INT,
username VARCHAR(16),
city VARCHAR(16),
age INT,
FULLTEXT INDEX indexName (username(10))
— 也可簡寫成 FULLTEXT indexName (username(10)))ENGINE=MYISAM;
— 建表時創建全文索引,要設置該表的存儲引擎為 MYISAM, 新版 mysql 默認 InnoDB 存儲引擎不支持全文索引
— 刪除索引 DROP INDEX indexName ON mytable;
雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行 INSERT、UPDATE 和 DELETE。因為更新表時,MySQL 不僅要保存數據,還要保存一下索引文件。
建立索引會占用磁盤空間的索引文件。一般情況這個問題不太嚴重,但如果你在一個大表上創建了多種組合索引,索引文件的會膨脹很快。
以上是“給 Myql 創建索引的方法”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!
向 AI 問一下細節