1. 程式人生 > 資料庫 >MySQL - 表索引

MySQL - 表索引

1. 索引概述

索引是一種特殊的資料庫結構,可以用來快速查詢資料庫表中的特定記錄,是提高資料庫效能的重要方式。MySQL中,所有的資料型別都可以被索引。

通過索引,查詢資料時可以不必讀完記錄的所有資訊,而只是查詢索引列,否則資料庫系統將讀取每條記錄的所有資訊進行匹配。例如,索引相當於新華字典的音序表,如果要查“過”字,如果不適用音序,就需要從字典的第一頁開始翻幾百頁;如果提取拼音出來,構成音序表,就只需要從10多頁的音序表中直接查詢,這樣就可以大大節省時間。因此,使用索引可以在很大程度上提高資料庫的查詢速度,有效地提高了資料庫系統的效能。

1.1 索引型別

索引型別都包括:普通索引、唯一性索引、全文索引、單列索引、多列索引和空間索引等,下文中將詳細介紹。

1.2 索引優點

可以提高檢索資料的速度。

1.3 索引缺點

建立和維護索引需要耗費時間,耗費時間的數量隨著資料量的增加而增加;索引需要佔用物理空間,每一個索引要佔一定的物理空間;增加、刪除和修改資料時,要動態地維護索引,造成資料的維護速度降低了。

1.4 使用建議

索引可以提高查詢的速度,但是會影響插入記錄的速度,因為向有索引的表中插入記錄時,資料庫系統會按照索引進行排序,這樣就降低了插入記錄的速度,插入大量記錄時的速度影響更加明顯。這種情況下,最好的辦法是先刪除表中的索引,然後插入資料,插入完成後再建立索引。

1.5 建立和檢視索引

建立索引是指在某個表的一列或多列上建立一個索引,以便提高對錶的訪問速度。建立索引有3種方式,分別是建立表的時候建立索引、在已經存在的表上建立索引和使用ALTER TABLE語句來建立索引。本節將根據具體的索引分類詳細的講解這3種建立方法。

1.6 索引儲存

資料庫底層索引實現主要有兩種儲存型別,B樹(BTREE) 和 雜湊(HASH)索引,InnoDB 和 MyISAM 使用 BTREE 索引;

而 MEMORY 儲存引擎可以使用 BTREE 和 HASH 索引,預設用 BTREE.在沒有指定的情況下,資料庫使用的引擎是 InnoDB。

 

2. 普通索引

所謂普通索引,就是在建立索引時,不附加任何限制條件(唯一、非空等限制)。該型別的索引可以建立在任何資料型別的欄位上。

2.1 建立表時定義索引

1 CREATE TABLE tablename
2 (
3     propname1 type1,
4     propname2 type2,
5     ……
6     propnamen type..n,
7      INDEX 
| KEY 8 [indexname] (propnamen [(length)] [ ASC | DESC ]) 9 );

其中,引數 INDEX 和 KEY 是用來指定欄位為索引的,兩者選擇其中之一就可以,作用是一樣的;引數 indexname 是索引名字,可省略;引數 propnamen 是索引對應的欄位的名稱,該欄位必須為前面定義好的欄位;引數 length 是可選引數,其指索引的長度,必須是字串型別才可以使用;引數 ASC和 DESC 都是可選引數,ASC 表示升序排列,DESC 表示降序排列,如果不指定則為升序。

1 mysql> create database school;       #建立資料庫school  
2 mysql> use school;             #選擇資料庫school  
3 mysql> create table class(id int, name varchar(128) UNIQUE, teacher varchar(64), INDEX index_no(id DESC));   #建立表class, 並建立為id 欄位索引  
4 mysql> show create table class;                  #查看錶結構 
5 mysql> insert into class values(1, '班級文字', 'A老師');    # 插入記錄1 
6 mysql> insert into class values(1, '班級文字', 'B老師);    # 插入記錄2 
7 mysql> select * from class where id > 0;            #根據id查詢記錄,結果將降序排列  

 

 

 2.2 已存在的表上建立索引

 方法一: 執行 create 語句

1 CREATE INDEX indexname ON tablename (propname [(length)] [ASC|DESC]);  

引數 INDEX 是用來指定欄位為索引,此處不能為 KEY;引數 indexname 是新建立的索引的名字;引數 tablename 是指需要建立索引的表的名稱,該表必須是已經存在的,如果不存在,需要先建立;引數 propname 指定索引對應的欄位的名稱,該欄位必須為前面定義好的欄位;引數 length 是可選引數,表示索引的長度,必須是字串型別才可以使用;引數 ASC 和 DESC 都是可選引數,ASC 表示升序排列,DESC 表示降序排列,預設升序。

1 mysql> create database school;                #建立資料庫school  
2 mysql> use school;                       #選擇資料庫school  
3 mysql> create table class(id int, name varchar(128) UNIQUE, teacher varchar(64));       #建立表class, 並建立為id 欄位索引  
4 mysql> create index index_id on class(id ASC);      #追加升序索引  
5 mysql> show create table class;               #查看錶定義  
6 mysql> insert into class values(1, '一班', 'Martin');   #插入記錄1 
7 mysql> insert into class values(1, '二班', 'Rock');    #插入記錄2 
8 mysql> select * from class where id > 0;           #根據id查詢記錄,結果將降序排列

 

 

方法二: 執行ALTER TABLE 語句

1 ALTER TABLE tablename ADD INDEX | KEY indexname  
2      (propname [(length)] [ASC|DESC]);

在上述語句中,引數tablename是需要建立索引的表;關鍵字IDNEX或KEY用來指定建立普通索引;引數indexname用來指定所建立的索引名;引數propname用來指定索引所關聯的欄位的名稱;引數length用來指定索引的長度;引數ASC用來指定升序排序;引數DESC用來指定降序排序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

==================================================================================================================