舉個例子:若將資料庫比作一本書,那麼索引就是書的目錄,用來提高查詢的速度。通過索引,查詢資料時可以不必讀完記錄的所有資訊,而只是查詢索引列。
表的不同的儲存引擎定義了每個表的最大索引數和最大索引長度。所有儲存引擎對每個表至少支援16個索引,總索引長度至少為256b,有些儲存引擎支援更多的索引數和更大的索引長度。
索引有兩種儲存型別,包括b型樹(btree)索引和雜湊(hash)索引。innodb和myisam儲存引擎支援btree索引;memory儲存引擎支援hash索引和btree索引,預設為前者。
索引的分類:
1、普通索引:在建立普通索引時,不附加任何限制條件。這類索引可以建立在任何資料型別中,其值是否唯一和非空由字段本身的完整性約束條件決定。
2、唯一性索引:使用unique引數可以設定索引為唯一性索引。在建立唯一性索引時,限制該索引的值必須是唯一的。通過唯一性索引,可以更快的確定某條記錄。主鍵就是一種特殊的唯一性索引。
3、全文索引:使用fulltext引數可以設定索引為全文索引。全文索引只能建立在char、varchar、或text型別的字段上。
4、單列索引:在表中的單個欄位上建立索引。單列索引只根據該欄位進行索引。單列索引可以是普通索引,也可以是唯一性索引,還可以是全文索引。只要保證該索引只對應乙個字段即可。
5、多列索引:多列索引是在表的多個欄位上建立乙個索引。但是,只有查詢條件中使用了這些欄位中的第乙個欄位時,索引才會被使用。
6、使用spatial引數可以設定索引為空間索引。目前只有myisam儲存引擎支援空間檢索,而且索引的字段不能為空值。
索引的設計原則:
1、選擇唯一性索引:唯一性索引的值是唯一的,可以更快地通過改索引來確定某條記錄。
2、為經常需要排序、分組和聯合操作的字段建立索引。經常需要使用order by、group by、distinct和union等操作的字段,排序操作會浪費很多時間。如果為其建立索引,可以有效地避免排序操作。
3、為經常作為查詢條件的字段建立索引。
4、限制索引的數目:索引的數目不是越多越好,每個索引都需要占用一定的磁碟空間,索引越多,需要的磁碟空間就越大。修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。
5、盡量使用資料量少的索引:如果索引的值很長,那麼查詢的速度會受到影響。
6、盡量使用字首來索引:如果索引欄位的值很長,最好使用值的字首來索引。如果值檢索欄位的前臉的若干個字元,那麼可以提高檢索速度。
7、刪除不再使用很少使用的索引:表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再需要。所以應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。
索引的操作:
建立表的時候建立索引:
mysql> create table 表名 (
屬性名1 資料型別 [完整性約束條件]
......
[ unique | fulltext | spatial ] index | key [別名] (屬性名1 ([長度]) [asc|desc])
);
對上述**解釋:
unique是可選引數,表示索引為唯一性索引,另外兩個同理;
index和key引數用來指定欄位為索引的,兩者選擇其中之一就可以了,作用時一樣的。
"別名"是可選引數,用來給建立的索引取新的名字。
"屬性名1"引數指定索引對應的字段和的名稱,該欄位必須為前面定義好的字段。
"長度"是可選引數,其指索引的長度,必須是字串型別才可以使用。
"asc" 和 "desc" 都是可選引數,前者表示公升序排列,後者表示降序排列。
在已經存在的表上建立索引:
mysql> create [unique | fulltext | spatial] index 索引名
on 表名 (屬性名1 [(長度)] [asc | desc]);
mysql> create index wid on school.student(id);
mysql> create index index_addr on school.student(address(4));
上述第二個例子中,查詢時可以只查詢address欄位的前4個字元,而不需要全部查詢。
使用alter table語句來建立索引:
mysql> alter table 表名 add [unique | fulltext | spatial] index
索引名 (屬性名1 [(長度)] [asc | desc]);
mysql> alter table school.student add index sid (id);
mysql> alter table school.student add index sname (name(20));
刪除索引:
mysql> drop index 索引名 on 表名;
刪除索引很容易理解,索引名我們可以通過下面的方式獲取:
mysql> show create table 表名;
mysql> show create table school.student;
使用explain語句可以檢視索引的使用情況,例如:
mysql> explain select * from school.student where sid = 1 \g
ps:建立唯一性索引時,字段可以沒有進行唯一性約束,也可以在該字段上成功建立唯一性索引。但是,這樣可能達不到提高查詢速度的目的。 MySQL索引入門
索引就相當於表的目錄一樣,可以提高我們查詢資料的效率,是一種資料結構。常見的mysql主要有兩種結構 hash索引和b 樹索引。使用哪種資料結構跟儲存引擎有關,innodb引擎預設使用的是b 樹。補充 b 樹索引和雜湊索引的區別?什麼場景不適合使用索引 2 對於那些只有很少資料值的列不適合建立索引 ...
MySQL索引入門
索引於mysql資料庫,就像是目錄於書籍,讀者可以通過目錄可以快速定位到自己想要的內容。同時,索引基本是對mysql進行查詢效能優化最有效的手段。因為mysql的索引是在引擎層而不是伺服器層實現的,所以不同儲存引擎的索引的種類和工作方式是不同的,即便看起來相同,底層實現邏輯也可能大相徑庭。b tre...
mysql索引入門總結
這是一篇適合初學者看的索引入門部落格,耐心看完,會學會的,參考總結出來的!索引是表的目錄,類似於字典中的目錄,用於快速定位查詢資料,索引會儲存在額外的檔案中。索引可以提高查詢速度,會減慢寫入速度,索引的缺點市建立和維護索引需要耗費時間。索引也不是越多越好,索引雖然可以提高查詢效率,但同時頁降低了in...