mysql教程:索引的使用
1. 索引(index)是幫助mysql高效擷取資料的資料結構。
它對于高性能非常關鍵,但人們通常會忘記或誤解它。
索引在資料越大的時候越重要。規模小、負載輕的資料庫即使沒有索引,也能有好的性能, 但是當資料增加的時候,性能就會下降很快。
tip:蠕蟲複制,可以快速複制大量的資料
例:insert into emp select * from emp;

2. mysql中常見的索引
◆普通索引
◆唯一索引
◆主鍵索引
◆組合索引
◆全文索引
◆外鍵 (隻有innodb存儲引擎才支援)
2.1普通索引:
這是最基本的索引,它沒有任何限制。有以下幾種建立方式:
有以下幾種建立方式:
◆建立索引
create index indexname on tablename(username(length));
◆修改表結構
alter tablename add index indexname (username(length))
tip:length可以小于字段實際長度;如果是blob 和 text 類型,必須指定length ,下同
◆建立表的時候直接指定
create table mytableuuu( id int not null, username varchar(16) not null, index indexname (username(length)) );
create table mytable(id int not null,username varchar(16) not null);
create index index1 on mytable(id); //建立普通索引
◆删掉索引:
drop index index1 on mytable;
有一個概念,
行定義:在聲明字段(列)的時候定義的,比如primary key
表定義:在所有字段(列)聲明完之後定義的,比如primary key,index
create table mytable(id int not null,username varchar(16) not null,index index1(username));
3.0唯一索引(unique)
索引列的值必須唯一,但允許有空值。
1)建立索引:create unique index indexname on tablename(tablecolumns(length))
2)修改表結構:alter tablename add unique [indexname] on (tablecolumns(length)
3)建立表的時候直接指定:create table tablename ( [...], unique [indexname](tablecolumns(length));
4.0主鍵索引(primary key)
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引:
create table mytable( id int not null, username varchar(16) not null, primary key(id) );
當然也可以用 alter 指令。
tip:記住:一個表隻能有一個主鍵。主鍵索引就是我們所說的主鍵。在一個表中,主鍵隻能有一個,但是普通索引和唯一索引可以有多個。
5.0組合索引
5.1多列索引,由多個列共同來組成一個索引。
增加組合索引
alter table mytable add index name_city_age(username,city,age);
對于組合索引,必須以最左索引為字首,依次排列的,才可以使用到組合索引,中間不能有間隔。
下面的可以使用到組合索引:
◆ username,city,age
◆ usernname,city
◆ usernname
下面的不可以使用到組合索引:
◆ city,age
◆ city
◆ age
注意組合索引,如果在某個表中,有多個索引,我們可以考慮一下,使用組合索引來優化。
5.2 explain語句:可以查詢sql 查詢語句使用的索引類型
6. 為什麼有索引,查詢加快?
6.1在mysql中,btree,二叉樹
二叉樹排序
35 17 39 9 28 65 56 87
6.2索引的優點:
加快查詢速度。
6.2 索引的缺點:
占用大量的磁盤空間。
但是對插入、删除和更新有影響。
6.3使用索引時,有以下一些技巧和注意事項:
◆索引不會包含有null值的列
隻要列中包含有null值都将不會被包含在索引中,複合索引中隻要有一列含有null值,那麼這一列對于此複合索引就是無效的。是以我們在資料庫設計時不要讓字段的預設值為null。
◆使用短索引
對串列進行索引,如果可能應該指定一個字首長度。例如,如果有一個char(255)的列,如果在前10個或20個字元内,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和i/o操作。
◆索引列排序
mysql查詢隻使用一個索引,是以如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。是以資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立複合索引。
◆like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引,而like “aaa%”可以使用索引。
◆不要在列上進行運算
select * from users where year(adddate)<2007; 将在每個行上進行運算,這将導緻索引失效而進行全表掃描,是以我們可以改成
select * from users where adddate<‘2007-01-01’;
◆不使用not in和<>操作
http://www.php100.com/html/webkaifa/database/mysql/2013/0316/12223.html