:索引是在儲存引擎中實現的,也就是說不同的儲存引擎,會使用不同的索引。myisam和innodb儲存引擎:只支援btree索引,也就是說預設使用btree,不能夠更換。memory/heap儲存引擎:支援hash和btree索引。
mysql的索引我們分為三大類來講單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引。
一、單列索引:乙個索引只包含單個列,但乙個表中可以有多個單列索引。 這裡不要搞混淆了
1:普通索引:mysql中基本索引型別,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹為了查詢資料更快一 點。
2:唯一索引:索引列中的值必須是唯一的,但是允許為空值。
3:主鍵索引:是一種特殊的唯一索引,不允許有空值。(主鍵約束,就是乙個主鍵索引)。
主鍵索引與唯一索引的區別:
1. 主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
2. 主鍵建立後一定包含乙個唯一性索引,唯一性索引並不一定就是主鍵。
3. 唯一性索引列允許空值,而主鍵列不允許為空值。
4. 主鍵索引在建立時,已經預設為非空值+ 唯一索引了。
5. 乙個表最多只能建立乙個主鍵索引,但可以建立多個唯一索引。
6. 主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
7. 主鍵可以被其他表引用為外來鍵,而唯一索引不能。
二、組合索引:在表中的多個字段組合上建立的索引,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用,使用組合索引時遵循最左字首集合。例如,這裡由id、name和age3個字段構成的索引,索引行中就按id/name/age的順序存放,索引可以索引下面字段組合(id,name,age)、(id,name)或者(id)。如果要查詢的字段不構成索引最左面的字首,那麼就不會是用索引,比如,age或者(name,age)組合就不會使用索引查詢。
三、全文索引:全文索引,只有在myisam引擎上才能使用,只能在char,varchar,text型別欄位上使用全文索引,介紹了要求,說說什麼是全文索引,就是在一堆文字中,通過其中的某個關鍵字等,就能找到該欄位所屬的記錄行,比如有"你是個大煞筆,二貨 ..." 通過大煞筆,可能就可以找到該條記錄。這裡說的是可能,因為全文索引的使用涉及了很多細節,我們只需要知道這個大概意思。一般開發中,不貴用到全文索引,因為其占用很大的物理空間和降低了記錄修改性,故較為少用。
建立索引的語句:
1:直接建立索引:
create index index_name on table(column(length)); 建立普通索引
create unique index indexname on table(column(length)); 建立唯一索引
create fulltext index index_content on article(content); 全文索引
2:修改表結構的方式新增索引:
alter table table_name add index index_name on (column(length)); 建立普通索引
alter table table_name add unique indexname on (column(length)); 建立唯一索引
alter table `table` add index name_city_age (name,city,age); 組合索引
alter table article add fulltext index_content(content); 全文索引
3:建立表的時候建立索引:
create table `table` (
`id` int(11) not null auto_increment ,
`title` char(255) character not null ,
`content` text character null ,
`time` int(10) null default null ,
primary key (`id`),
index index_name (title(length))
); 普通索引
create table `table` (
`id` int(11) not null auto_increment ,
`title` char(255) character not null ,
`content` text character null ,
`time` int(10) null default null ,
unique indexname (title(length))
); 唯一索引
create table `table` (
`id` int(11) not null auto_increment ,
`title` char(255) not null ,
primary key (`id`)
); 主鍵索引
create table `table` (
`id` int(11) not null auto_increment ,
`title` char(255) character not null ,
`content` text character null ,
`time` int(10) null default null ,
primary key (`id`),
fulltext (content)
); 全文索引
4:刪除索引:
drop index index_name on table;
5:檢視索引:
show index from table_name;
索引的優缺點:
1、優點:建立索引可以大大提高系統的效能。
第一、通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。
第二、可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因。 第
三、可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。
第四、在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。
2、缺點:
增加索引有如此多的優點,為什麼不對錶中的每乙個列建立乙個索引呢?
這是因為,增加索引也有許多不利的乙個方面: 第
一、建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
第二、索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間。如果要建立聚簇索引,那麼 需要的空間就會更大。
第三、當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
哪些字段適合作為索引(不適合作為索引):
一般來說,應該在這些列上建立索引,例如:
第一、在經常需要搜尋的列上,可以加快搜尋的速度; 第
二、在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構; 第
三、在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度; 第
四、在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的; 第
五、在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間; 第
六、在經常使用在where子句中的列上面建立索引,加快條件的判斷速度。
什麼樣的字段不適合建立索引:
第一,對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,
並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
第二,對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,
在查詢的結果中,結果集的資料行佔了表中資料行的很大比 例,即需要在表中搜尋的資料行的比例很大。
增加索引,並不能明顯加快檢索速度。
第三,對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。
第四,當修改效能遠遠大於檢索效能時,不應該建立索 引。這是因為,修改效能和檢索效能是互相矛盾的。
當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。
因此,當修改效能遠遠大於檢索效能時,不應該建立索引。
索引的分類與優缺點
分類 索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了 聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。索引的優缺點 概述 建立索引的目的是加快對錶中記錄的查詢或排序。為表設定索引要付出代價的 一是增加了資料庫的儲存空間,二是在插入和修...
索引優缺點
優點 1 建立唯一性索引,保證資料庫表中每一行資料的唯一性 2 大大加快表的檢索速度,是建立索引的主要原因 4 在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間 5 使用索引,可以在查詢的過程中使用優化隱藏器,提高系統效能 缺點 1 索引占用磁碟空間,除了資料表要占用資料空...
索引(優缺點)
在關聯式資料庫中,索引是一種單獨的 物理的,對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。1 通過建立唯一性索引,可以保證資料庫表中每一行資料...