1. 程式人生 > >MySQL優化06 索引(一)

MySQL優化06 索引(一)

  當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引,如面SQL語句所示:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  這是的id列就是主鍵索引,為什麼這麼說呢?這就需要我們知道如何查詢索引,下面先介紹一下如何查詢索引,SQL語句如下:

SHOW INDEX FROM test;

查詢結果如下:
這裡寫圖片描述

下面簡單介紹一下各個列的作用:
table:索引所在表的名稱
Non_unique:這裡理解起來有點兒怪,可以理解為非唯一,在計算機中,0表示否,1表示是,所以在0的時候表示不是非唯一,也就是唯一的意思,不允許重複的值,如果是1就是可以有重複的值。
Key_name:索引名稱,此處為PRIMARY,表示是主鍵索引,因為主鍵索引預設使用的名稱就是PRIMARY。
Null:表示該列是否可以為NULL,如果可以會顯示YES,空的話就不能有NULL值。
Index_type:索引型別,一般都是BTREE,二叉樹,二叉樹的意思也就是把值做成樹形結果,並且按照值大小分為左右兩側,這樣查詢的時候都是一次就過濾掉50%的資料,非常快。

唯一索引

如何我們在建立表的時候,指定欄位為UNIQUE,那麼該欄位會自動建立為唯一索引,SQL語句如下:

CREATE TABLE ddd(
    id INT PRIMARY KEY auto_increment,
    name VARCHAR(32) UNIQUE
);
SHOW INDEX FROM ddd;

查詢結果如下所示:
這裡寫圖片描述
可以看到有兩個索引,第一個是主鍵索引,之前已經說過了,第二個就是唯一索引,索引名稱就是欄位的名稱。

刪除索引

SQL語句如下:

ALTER TABLE eee DROP INDEX my_uni;

上面的方式可以刪除普通的索引,組合索引,唯一索引等等,但是無法刪除主鍵索引,要刪除主鍵索引需要下面的SQL語句:

ALTER TABLE eee DROP PRIMARY KEY;

這裡注意我遇到了這樣的一個問題:

 Incorrect table definition; there can be only one auto column and it must be defined as a key

這裡是說,如果一個欄位是自增長的,那麼它必須是主鍵,所以在刪除主鍵的時候要注意這個欄位是否是自增長的,如果是自增長的,需要先刪除自增長,可以使用如下SQL:

ALTER TABLE eee MODIFY id int(11) NOT NULL;

這樣去掉了自增長之後,就可以安心的去掉主鍵了。