索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可以有多個單列索引,但這不是組合索引。組合索引,即乙個索包含多個列。
索引是快速搜尋的關鍵。mysql索引的建立對於mysql的高效執行是很重要的。
1.普通索引
普通索引(由關鍵字key或index定義的索引)的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件(where column = …)或排序條件(order by column)中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊、最緊湊的資料列(如乙個整數型別的資料列)來建立索引。
create index indexname on tb_name(col_name(length));
如果型別是varchar、char的length可以小於字段實際長度,如果是blob和text型別,必須指定 length,下同。
刪除乙個索引
drom index indexname on tb_name;
2. 唯一索引
普通索引允許被索引的資料列包含重複的值。比如說,因為人有可能同名,所以同乙個姓名在同乙個」員工個人資料」資料表裡可能出現兩次或更多次。
如果能確定某個資料列將只包含彼此各不相同的值,在為這個資料列建立索引的時候就應該用關鍵字unique把它定義為乙個唯一索引。這麼做的好處:一是簡 化了mysql對這個索引的管理工作,這個索引也因此而變得更有效率;二是mysql會在有新記錄插入資料表時,自動檢查新記錄的這個欄位的值是否已經在 某個記錄的這個欄位裡出現過了;如果是,mysql將拒絕插入那條新記錄。也就是說,唯一索引可以保證資料記錄的唯一性。事實上,在許多場合,人們建立唯 一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複。
create unique index indexname on tb_name(col_name(length));
它與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。
3.主鍵索引
在前面已經反覆多次強調過:必須為主鍵欄位建立乙個索引,這個索引就是所謂的」主索引」。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是 primary而不是unique。
id int not null, primary key(id);
主鍵索引是一種特殊的唯一索引,它不允許列值為空值,且每個表中只能有乙個唯一的主鍵
4.聯合索引
create index indexname on tb_name(col1,col2,col3);
聯合索引可以進一步的提高mysql的效率,這樣把col1,col2,col3 建到乙個索引裡。如果單獨的在
col1、col2、c0l3上建立單列索引,該錶就有3個單列索引,查詢會遠遠低於上述的組合索引,
建立這樣的索引,其實是相當於建立了以下3組索引
1. col1、col2、c0l3
2. col1、col2
3. col1
細心的朋友可能發現沒有 col2、c0l3這樣的組合索引,這是因為mysql索引遵循「最左字首」的結果。意思就是說只能從最左邊的開始組合。
可以用到組合索引的例子:
select * from tb_name where col1=』***』 and col2=』***』
select * from tb_name where col1=』***』
不會用到的
select * from tb_name where col2=』***』 and col3=』***』
select * from tb_name where col2=』***』
索引的不足之處
1。雖然加快了對資料的查詢速度,但對降低了insert、update、delete操作的速度,因為它們在更新資料表的同時也要更新索引檔案。
2. 如果你的表很大,索引檔案也會很大,會降低磁碟空間和i/o操作(該問題不大)
什麼時候使用索引
一般來說,在where和join中出現的列需要建立索引,但也不完全如此,因為mysql只對<,<=,=,>,>=,between,in,以
及某些時候的like才會使用索引。某些like是指 『***%』 而不支援『%***』。
3. 主索引
在前面已經反覆多次強調過:必須為主鍵欄位建立乙個索引,這個索引就是所謂的」主索引」。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是 primary而不是unique。
4. 外來鍵索引
如果為某個外來鍵字段定義了乙個外來鍵約束條件,mysql就會定義乙個內部索引來幫助自己以最有效率的方式去管理和使用外來鍵約束條件。
5. 復合索引
索引可以覆蓋多個資料列,如像index(columna, columnb)索引。這種索引的特點是mysql可以有選擇地使用乙個這樣的索引。如果查詢操作只需要用到columna資料列上的乙個索引,就可以使 用復合索引index(columna, columnb)。不過,這種用法僅適用於在復合索引中排列在前的資料列組合。比如說,index(a, b, c)可以當做a或(a, b)的索引來使用,但不能當做b、c或(b, c)的索引來使用。
6. 索引的長度
在為char和varchar型別的資料列定義索引時,可以把索引的長度限制為乙個給定的字元個數(這個數字必須小於這個欄位所允許的最大字元個數)。這 麼做的好處是可以生成乙個尺寸比較小、檢索速度卻比較快的索引檔案。在絕大多數應用裡,資料庫中的字串資料大都以各種各樣的名字為主,把索引的長度設定 為10~15個字元已經足以把搜尋範圍縮小到很少的幾條資料記錄了。
在為blob和text型別的資料列建立索引時,必須對索引的長度做出限制;mysql所允許的最大索引長度是255個字元。
全文索引
文字欄位上的普通索引只能加快對出現在字段內容最前面的字串(也就是字段內容開頭的字元)進行檢索操作。如果欄位裡存放的是由幾個、甚至是多個單詞構成 的較大段文字,普通索引就沒什麼作用了。這種檢索往往以like %word%的形式出現,這對mysql來說很複雜,如果需要處理的資料量很大,響應時間就會很長。
這類場合正是全文索引(full-text index)可以大顯身手的地方。在生成這種型別的索引時,mysql將把在文字中出現的所有單詞建立為乙份清單,查詢操作將根據這份清單去檢索有關的數 據記錄。全文索引即可以隨資料表一同建立,也可以等日後有必要時再使用下面這條命令新增:
alter table tablename add fulltext(column1, column2)
有了全文索引,就可以用select查詢命令去檢索那些包含著乙個或多個給定單詞的資料記錄了。下面是這類查詢命令的基本語法:
select * from tablename
where match(column1, column2) against(『word1′, 『word2′, 『word3′)
上面這條命令將把column1和column2欄位裡有word1、word2和word3的資料記錄全部查詢出來。
註解:innodb資料表不支援全文索引。
mysql索引型別介紹 mysql索引型別介紹
索引型別介紹 主鍵索引 primary key 要求關鍵字不能重複,也不能為null,同時增加主鍵約束 主鍵索引定義時,不能命名 唯一索引 unique index 要求關鍵字不能重複,同時增加唯一約束 普通索引 index 對關鍵字沒有要求 全文索引 fulltext key 關鍵字的 不是所有欄...
mysql索引型別介紹 mysql索引型別介紹
b 樹是多路平衡查詢樹,相對於平衡二叉樹,對父結點的直接子結點個數,不再僅限於2,可以指定m 自定義 這樣可以在樹的深度不大量增加的前提下,儲存更多的結點。b 樹是通常在檔案系統中使用。特點 a 樹的每個結點最多有m 自定義 子結點 b 若根結點不是葉子結點,則至少有兩個子結點 c 除根結點外的所有...
MySQL索引型別介紹
最為mysql最重要的部分之一,索引是學習mysql資料庫不能不提到的。下面就為您詳細介紹各種型別的mysql索引,供您參考學習。1 普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 wherecolumn 或排序條件...