數據庫調優教程(五) 索引的作用和索引的種類

三、           索引


上一章我們學習了使用explain來生成一個查詢執行計劃(QEP),從而發現語句存在的問題。在explain返回的結果中,有三個是和索引有關的(possible key、key、extra),可見索引在改善查詢效率上的顯著地位。

這一章,我們將全方位講解如何使用索引來優化我們的數據庫。

1.      索引的作用

索引的原理是利用特殊的查找算法(如二叉樹算法),限制訪問的行數,提高訪問效率。

另外,索引還可以高效地在表之間建立連接操作,高效的對結果進行排序等等

2.      基本索引種類及創建

索引可以分爲主鍵索引、普通索引、唯一索引和全文索引。

1)    主鍵索引

當一張表,把某個列設爲主鍵的時候,則該列就是主鍵索引

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. create table aaa  
  2. (id int unsigned primary key auto_increment ,  
  3. name varchar(32) not null defaul ‘’);  

這是id 列就是主鍵索引.

如果你創建表時,沒有指定主鍵索引,也可以在創建表後再添加

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. alter table 表名 add primary key (列名);  

2)    普通索引

一般來說,普通索引的創建,是先創建表,然後在創建普通索引

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. create index 索引名 on 表 (列名1,列名2);  

當括號中的列不止一個時,我們稱之爲多列索引,多列索引在一定情況下可以進化爲覆蓋索引(後面會介紹)。

這裏我們通過在emp表中創建普通索引來見識一下索引的威力。

在未創建索引前

我們執行以下語句

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. select count(1) from emp where ename like 'yu%';  


接着我們創建索引

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. create index index_ename on emp(ename);  


再次執行

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. select count(1) from emp where ename like 'yu%';  


不可思議!

索引的威力可見一斑!

當然索引是有開銷的

這是我在未創建索引時mysql安裝目錄下data/bigtable/emp.ibd文件的大小,對於innodb引擎的表來說,ibd文件存放了表的數據和索引。


在我創建了索引之後


顯然,索引會佔用主機的空間,這也稱作索引的開銷。

3)    唯一索引

當表的某列被指定爲unique約束時,這列就是一個唯一索引
[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. create table ddd(id int primary key auto_increment , name varchar(32) unique);  

這時, name 列就是一個唯一索引

在創建表後,再去創建唯一索引

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. create unique index 索引名  on 表名 (列表..);  
unique字段可以爲NULL,並可以有多NULL,即Null!=Null。但是如果是具體內容,則不能重複

4)    全文索引

全文索引,只對MyISAM引擎有用。主要是針對對文件,文本的檢索, 比如文章或者段落,.

它會把某個數據表的某個數據列出現過的所有單詞生成一份清單

全文索引的創建

在創建表時創建

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. CREATE TABLE articles (  
  2.        id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,  
  3.        title VARCHAR(200),  
  4.        body TEXT,  
  5.        FULLTEXT (title,body)  
  6.      )engine=myisam charset utf8;  

或者在創建表後添加

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. ALTER TABLE articles ADD FULLTEXT (title,body);  

全文索引正確的用法是:

[plain] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. select * from articles where match(title,body) against(‘要搜索的單詞’);  

另外,mysql自己提供的fulltext針對英文生效,想要搜索中文需要使用sphinx全文檢索引擎或者使用加強版的模糊查詢

注意:

全文索引不完全等同於模糊查詢

比如title字段有這麼個數據’abcd20088ccaa’,使用模糊查詢select * from articleswhere title like’%2008%’可以查找到,而使用全文檢索select * from articleswhere match(title) against(‘2008’);是檢索不到的,因爲2008不是一個單詞
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章