一、索引
MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作爲 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因爲更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
建立索引會佔用磁盤空間的索引文件。
二、索引類型
Mysql目前主要有以下幾種索引類型:FULLTEXT,HASH,BTREE,RTREE。
1. FULLTEXT
即爲全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創建全文索引。
全文索引並不是和MyISAM一起誕生的,它的出現是爲了解決WHERE name LIKE “%word%"這類針對文本的模糊查詢效率較低的問題。
2. HASH
由於HASH的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作爲索引。
HASH索引可以一次定位,不需要像樹形索引那樣逐層查找,因此具有極高的效率。但是,這種高效是有條件的,即只在“=”和“in”條件下高效,對於範圍查詢、排序及組合索引仍然效率不高。
3. BTREE
BTREE索引就是一種將索引值按一定的算法,存入一個樹形的數據結構中(二叉樹),每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。這是MySQL裏默認和最常用的索引類型。
4. RTREE
RTREE在MySQL很少使用,僅支持geometry數據類型,支持該類型的存儲引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對於BTREE,RTREE的優勢在於範圍查找。
按字段特性分類
MySQL索引按字段特性分類可分爲:主鍵索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。
-
主鍵索引(PRIMARY KEY)
建立在主鍵上的索引被稱爲主鍵索引,一張數據表只能有一個主鍵索引,索引列值不允許有空值,通常在創建表時一起創建。 -
唯一索引(UNIQUE)
建立在UNIQUE字段上的索引被稱爲唯一索引,一張表可以有多個唯一索引,索引列值允許爲空,列值中出現多個空值不會發生重複衝突。 -
普通索引(INDEX)
建立在普通字段上的索引被稱爲普通索引。 -
全文索引(FULLTEXT)
MyISAM 存儲引擎支持Full-text索引,用於查找文本中的關鍵詞,而不是直接比較是否相等。Full-text索引一般使用倒排索引實現,它記錄着關鍵詞到其所在文檔的映射。
三、索引種類
- 普通索引:僅加速查詢
- 唯一索引:加速查詢 + 列值唯一(可以有null)
- 主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個
- 組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併
- 全文索引:對文本的內容進行分詞,進行搜索
ps.
索引合併,使用多個單列索引組合搜索
覆蓋索引,select的數據列只用從索引中就能夠取得,不必讀取數據行,換句話說查詢列要被所建的索引覆蓋
四、操作索引
//創建索引語法 CREATE TABLE table_name[col_name data type] [unique|fulltext|spatial][index|key][index_name](col_name[length])[asc|desc]
1、unique|fulltext|spatial爲可選參數,分別表示唯一索引、全文索引和空間索引;
2、index和key爲同義詞,兩者作用相同,用來指定創建索引
3、col_name爲需要創建索引的字段列,該列必須從數據表中該定義的多個列中選擇;
4、index_name指定索引的名稱,爲可選參數,如果不指定,MYSQL默認col_name爲索引值;
5、length爲可選參數,表示索引的長度,只有字符串類型的字段才能指定索引長度;
6、asc或desc指定升序或降序的索引值存儲
主鍵索引:
# 查看創建的索引關鍵詞 PRIMARY KEY (`id`)
唯一索引:
-
索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一
# 創建唯一索引 mysql> alter table t1 add unique idx_u1(`u1`); # 查看創建的索引關鍵詞 UNIQUE KEY `idx_u1` (`u1`)
普通索引-單列索引:
-
即索引創建在單個列上
# 創建單列索引 mysql> alter table t1 add index idx_u1(`u1`); # 查看創建的索引關鍵詞 KEY `idx_u1` (`u1`)
普通索引-多列索引:
-
創建多列索引時記得遵循最左匹配原則,把區分度較高的字段放前面
# 創建多列索引 mysql> alter table t1 add index idx_u1_u2(`u1`,`u2`); # 查看創建的多列索引關鍵詞 KEY `idx_u1_u2` (`u1`,`u2`)
案例:
DROP TABLE IF EXISTS `{dbprefix}order_cart`; CREATE TABLE IF NOT EXISTS `{dbprefix}order_cart` ( `id` BIGINT(18) unsigned NOT NULL AUTO_INCREMENT, `mid` varchar(100) NOT NULL COMMENT '模塊mid', `uid` int(10) unsigned NOT NULL COMMENT '購買者', `agent` varchar(100) NOT NULL COMMENT '客戶端編碼', `cid` int(10) unsigned NOT NULL COMMENT '商品id', `price` decimal(10,2) NOT NULL COMMENT '售價', `quantity` int(10) NOT NULL COMMENT '數量', `sku_name` text NOT NULL COMMENT '商品屬性名稱', `sku_value` varchar(255) NOT NULL COMMENT '商品屬性參數', `title` varchar(255) NOT NULL COMMENT '商品名稱', `thumb` varchar(255) NOT NULL COMMENT '縮略圖', `url` varchar(255) NOT NULL COMMENT '商品地址', `inputtime` int(10) NOT NULL COMMENT '加入時間', PRIMARY KEY (`id`), KEY `mid` (`mid`), KEY `uid` (`uid`), KEY `agent` (`agent`), KEY `price` (`price`), KEY `sku_value` (`sku_value`), KEY `inputtime` (`inputtime`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='我的購物車表';
2022-10-15
參考文檔:https://blog.csdn.net/n88Lpo/article/details/125923475