mysql索引分類以及創建使用

一、索引

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)。

    1. 主鍵索引(PRIMARY KEY)
      建立在主鍵上的索引被稱爲主鍵索引,一張數據表只能有一個主鍵索引,索引列值不允許有空值,通常在創建表時一起創建。

    2. 唯一索引(UNIQUE)
      建立在UNIQUE字段上的索引被稱爲唯一索引,一張表可以有多個唯一索引,索引列值允許爲空,列值中出現多個空值不會發生重複衝突。

    3. 普通索引(INDEX)
      建立在普通字段上的索引被稱爲普通索引。

    4. 全文索引(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

 

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