1. 程式人生 > >MySQL索引操作:建立、新增和刪除索引

MySQL索引操作:建立、新增和刪除索引

如果對索引的作用不太瞭解的建議先閱讀上一篇博文:MySQL索引的作用和分類介紹

建立索引

建立表的時候建立索引

  • 格式:
CREATE TABLE 表名[欄位名 欄位型別] [UNIQUE|FULLTEXT|SPATIAL|...] [INDEX|KEY] [索引名字] (欄位名[length])   [ASC|DESC]
普通建立表語句               設定什麼樣的索引(唯一、全文等)    索引關鍵字   索引名字   對哪個欄位設定索引  對索引進行排序

建立普通索引:

CREATE TABLE book                    CREATE TABLE boo
   (                              (
     bookid INT NOT NULL,                  bookid INT NOT NULL,
      bookname VARCHAR(255) NOT NULL,            bookname VARCHAR(255) NOT NULL,
     authors VARCHAR(255) NOT NULL,             authors VARCHAR(255) NOT NULL,
     info VARCHAR(255) NULL,                 info VARCHAR(255) NULL,
      comment VARCHAR(255) NULL,                comment VARCHAR(255) NULL, 
     year_publication YEAR NOT NULL,            year_publication YEAR NOT NULL,
     INDEX(year_publication)                 KEY(year_publication) 
   );                              );

上面兩種方式建立都可以,通過這個例子可以對比一下格式,通過列印結果,我們在建立索引時沒寫索引名的話,會自動幫我們用欄位名當作索引名。
在這裡插入圖片描述

  • 測試:看是否使用了索引進行查詢
EXPLAIN SELECT * FROM book WHERE year_publication = 1990\G;
解釋:雖然表中沒資料,但是有EXPLAIN關鍵字,用來檢視索引是否正在被使用,並且輸出其使用的索引的資訊。

在這裡插入圖片描述

欄位 解釋
id SELECT識別符。這是SELECT的查詢序列號,也就是一條語句中,該select是第幾次出現。在次語句中,select就只有一個,所以是1。
select_type 所使用的SELECT查詢型別,SIMPLE表示為簡單的SELECT,不實用UNION或子查詢,就為簡單的SELECT。也就是說在該SELECT查詢時會使用索引。其他取值,PRIMARY:最外面的SELECT.在擁有子查詢時,就會出現兩個以上的SELECT。UNION:union(兩張表連線)中的第二個或後面的select語句 SUBQUERY:在子查詢中,第二SELECT。
table 資料表的名字。他們按被讀取的先後順序排列,這裡因為只查詢一張表,所以只顯示book
type 指定本資料表和其他資料表之間的關聯關係,該表中所有符合檢索值的記錄都會被取出來和從上一個表中取出來的記錄作聯合。ref用於連線程式使用鍵的最左字首或者是該鍵不是 primary key 或 unique索引(換句話說,就是連線程式無法根據鍵值只取得一條記錄)的情況。當根據鍵值只查詢到少數幾條匹配的記錄時,這就是一個不錯的連線型別。(注意,個人這裡不是很理解,百度了很多資料,全是大白話,等以後用到了這類資訊時,在回過頭來補充,這裡不懂對後面的影響不大。)可能的取值有 system、const、eq_ref、index和All
possible_keys MySQL在搜尋資料記錄時可以選用的各個索引,該表中就只有一個索引,year_publication
key 實際選用的索引
key_len 顯示了mysql使用索引的長度(也就是使用的索引個數),當 key 欄位的值為 null時,索引的長度就是 null。注意,key_len的值可以告訴你在聯合索引中mysql會真正使用了哪些索引。這裡就使用了1個索引,所以為1
ref 給出關聯關係中另一個數據表中資料列的名字。常量(const),這裡使用的是1990,就是常量。
rows MySQL在執行這個查詢時預計會從這個資料表裡讀出的資料行的個數。
extra 提供了與關聯操作有關的資訊,沒有則什麼都不寫。

建立唯一索引

CREATE TABLE t1
    (
     id INT NOT NULL,
     name CHAR(30) NOT NULL,
     UNIQUE INDEX UniqIdx(id)
 ); 
 
 解釋:對id欄位使用了索引,並且索引名字為UniqIdx。

在這裡插入圖片描述

要檢視其中查詢時使用的索引,必須先往表中插入資料,然後在查詢資料,不然查詢一個沒有的id值,是不會使用索引的。

在這裡插入圖片描述

可以看到,通過id查詢時,會使用唯一索引。並且還實驗了查詢一個沒有的id值,則不會使用索引,我覺得原因是所有的id應該會儲存到一個const tables中,返現其中並沒有該id值,那麼就沒有查詢的必要了。


建立主鍵索引

CREATE TABLE t2
	(
 		id INT NOT NULL,
		name CHAR(10),
		PRIMARY KEY(id)
	); 

在這裡插入圖片描述

通過這個主鍵索引,我們就應該反應過來,其實我們以前宣告的主鍵約束,就是一個主鍵索引,只是之前我們沒學過,不知道而已。


建立組合索引

CREATE TABLE t3
	(
		id INT NOT NULL,
		name CHAR(30) NOT NULL,
		age INT NOT NULL,
		info VARCHAR(255),
		INDEX MultiIdx(id,name,age)
	);

在這裡插入圖片描述

最左字首
   組合索引就是遵從了最左字首,利用索引中最左邊的列集來匹配行,這樣的列集稱為最左字首,不明白沒關係,舉幾個例子就明白了,例如,這裡由id、name和age3個欄位構成的索引,索引行中就按id/name/age的順序存放,索引可以索引下面欄位組合(id,name,age)、(id,name)或者(id)。如果要查詢的欄位不構成索引最左面的字首,那麼就不會是用索引,比如,age或者(name,age)組合就不會使用索引查詢。

  • 查詢id和name欄位:
    在這裡插入圖片描述

  • 查詢age,name欄位:
    在這裡插入圖片描述


建立全文索引:通過關鍵字就能夠找到該記錄

全文索引可以用於全文搜尋,但只有MyISAM儲存引擎支援FULLTEXT索引,並且只為CHAR、VARCHAR和TEXT列服務。索引總是對整個列進行,不支援字首索引。

CREATE TABLE t4
	(
		id  INT NOT NULL,
		name CHAR(30) NOT NULL,
		age INT NOT NULL,
		info VARCHAR(255),
		FULLTEXT INDEX FullTxtIdx(info)
	)ENGINE=MyISAM;

在這裡插入圖片描述

  • 插入資料:
INSERT INTO t4 VALUES(8,'AAA',3,'text is so good,hei,my name is bob'),(9,'BBB',4,'my name is gorlr');

  • 查詢:
    在這裡插入圖片描述

在這裡插入圖片描述

注意: 在使用全文搜尋時,需要藉助MATCH函式,並且其全文搜尋的限制比較多,比如只能通過MyISAM引擎,比如只能在CHAR,VARCHAR,TEXT上設定全文索引。比如搜尋的關鍵字預設至少要4個字元,比如搜尋的關鍵字太短就會被忽略掉。等等,如果你們在實驗的時候可能會實驗不出來。


建立空間索引

空間索引也必須使用MyISAM引擎, 並且空間型別的欄位必須為非空。 這個空間索引具體能幹嘛我也不知道,可能跟遊戲開發有關,可能跟別的東西有關,等遇到了自然就知道了,現在只要求能夠創建出來。

CREATE TABLE t5
	(
		g GEOMETRY NOT NULL,
		SPATIAL INDEX spatIdx(g)
	) ENGINE = MyISAM;

在這裡插入圖片描述

在已經存在的表上建立索引

格式

ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名] (索引欄位名)[ASC|DESC]
  • 檢視一張表中所建立的索引
    在這裡插入圖片描述

為表新增索引

在這裡插入圖片描述

使用CREATE INDEX建立索引

  • 格式:
CREATE [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] 索引名稱 ON 表名(建立索引的欄位名[length])[ASC|DESC]

在這裡插入圖片描述

在這裡插入圖片描述

刪除索引

格式一

ALTER TABLE 表名 DROP INDEX 索引名

在這裡插入圖片描述

在這裡插入圖片描述

格式二

DROP INDEX 索引名 ON 表名

在這裡插入圖片描述

轉自:https://www.cnblogs.com/whgk/p/6179612.html