三、 索引
上一章我們學習了使用explain來生成一個查詢執行計劃(QEP),從而發現語句存在的問題。在explain返回的結果中,有三個是和索引有關的(possible key、key、extra),可見索引在改善查詢效率上的顯著地位。
這一章,我們將全方位講解如何使用索引來優化我們的數據庫。
1. 索引的作用
索引的原理是利用特殊的查找算法(如二叉樹算法),限制訪問的行數,提高訪問效率。
另外,索引還可以高效地在表之間建立連接操作,高效的對結果進行排序等等
2. 基本索引種類及創建
索引可以分爲主鍵索引、普通索引、唯一索引和全文索引。
1) 主鍵索引
當一張表,把某個列設爲主鍵的時候,則該列就是主鍵索引
- create table aaa
- (id int unsigned primary key auto_increment ,
- name varchar(32) not null defaul ‘’);
這是id 列就是主鍵索引.
如果你創建表時,沒有指定主鍵索引,也可以在創建表後再添加
- alter table 表名 add primary key (列名);
2) 普通索引
一般來說,普通索引的創建,是先創建表,然後在創建普通索引
- create index 索引名 on 表 (列名1,列名2);
當括號中的列不止一個時,我們稱之爲多列索引,多列索引在一定情況下可以進化爲覆蓋索引(後面會介紹)。
這裏我們通過在emp表中創建普通索引來見識一下索引的威力。
在未創建索引前
我們執行以下語句
- select count(1) from emp where ename like 'yu%';
接着我們創建索引
- create index index_ename on emp(ename);
再次執行
- select count(1) from emp where ename like 'yu%';
不可思議!
索引的威力可見一斑!
當然索引是有開銷的
這是我在未創建索引時mysql安裝目錄下data/bigtable/emp.ibd文件的大小,對於innodb引擎的表來說,ibd文件存放了表的數據和索引。
在我創建了索引之後
顯然,索引會佔用主機的空間,這也稱作索引的開銷。
3) 唯一索引
當表的某列被指定爲unique約束時,這列就是一個唯一索引- create table ddd(id int primary key auto_increment , name varchar(32) unique);
這時, name 列就是一個唯一索引
在創建表後,再去創建唯一索引
- create unique index 索引名 on 表名 (列表..);
4) 全文索引
全文索引,只對MyISAM引擎有用。主要是針對對文件,文本的檢索, 比如文章或者段落,.
它會把某個數據表的某個數據列出現過的所有單詞生成一份清單
全文索引的創建
在創建表時創建
- CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- )engine=myisam charset utf8;
或者在創建表後添加
- ALTER TABLE articles ADD FULLTEXT (title,body);
全文索引正確的用法是:
- 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不是一個單詞!