天天看點

access建立兩個字段唯一索引_前阿裡P7架構師的詳解MySQL——索引介紹一、定義:二、簡介:三、索引優點:四、索引的缺點:五、MySql索引的分類:六、索引表的設計原則:八、已存在表中建立索引:九、總結:推薦閱讀

access建立兩個字段唯一索引_前阿裡P7架構師的詳解MySQL——索引介紹一、定義:二、簡介:三、索引優點:四、索引的缺點:五、MySql索引的分類:六、索引表的設計原則:八、已存在表中建立索引:九、總結:推薦閱讀

一、定義:

索引用于快速找出某個列中有一特定值的行。

不使用索引,MySql必須從第一條記錄開始讀完整個表,直到找出相關的行。表越大,查詢資料所花費的時間越多。

如果表中查詢的列有一個索引,Mysql能快速到達一個位置去搜尋資料檔案,而不必檢視所有資料。

二、簡介:

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可以提高資料庫中特定資料的查詢速度。

索引是一個單獨的、存儲在磁盤上的資料庫結構,他們包含着對資料表裡所有記錄的引用指針。

使用索引用于快速找出某個或者多個列中有一特定值的行,所有Mysql列類型都可以被索引,對相關列使用索引是提高查詢操作速度的最佳途徑。

例如:資料庫中有2萬條記錄,現在要執行這樣一個查詢:

select * from table where num=10000
           

如果沒有索引,必須周遊整個表,直到num等于10000的這一行被找到為止。

如果在num列上建立索引,MySql不需要任何掃描,直接在索引裡面找到10000,就可以得知這一行的位置。

索引是存儲引擎實作的,是以,每種存儲引擎的索引都不一定完全相同,并且每種存儲引擎也不一定支援所有索引類型。

根據存儲引擎定義每個表的最大索引數和最大索引長度。所有存儲引擎支援每個表至少16個索引,總索引長度至少為256位元組。大多數存儲引擎有更高的限制。

MySql中索引的存儲類型有兩種:BTREE和HASH,具體和表的存儲引擎相關;MyISAM和InnoDB存儲引擎都支援BTREE索引;MEMORY/HEAP存儲引擎可以支援BTREE和HASH索引。

access建立兩個字段唯一索引_前阿裡P7架構師的詳解MySQL——索引介紹一、定義:二、簡介:三、索引優點:四、索引的缺點:五、MySql索引的分類:六、索引表的設計原則:八、已存在表中建立索引:九、總結:推薦閱讀

三、索引優點:

1、通過建立唯一索引,可以保證資料庫表中每一行資料的唯一性。

2、可以大大加快資料的查詢速度,這也是建立索引的最主要的原因。

3、在實作資料的參考完整性方面,可以加速表和表之間的連結。

4、在使用分組和排序子句進行資料查詢時,也可以顯著減少查詢中分組和排序的時間。

四、索引的缺點:

1、建立索引和維護索引要耗費時間,并且随着資料量的增加所耗費的時間也會增加。

2、索引需要占據磁盤空間,除了資料表占資料空間之外,每一個索引還要占一定的實體空間,如果有大量的索引,索引檔案可能比資料檔案更快達到最大檔案尺寸。

3、當對表中的資料進行增加、删除和修改的時候,索引也要動态維護,這樣就降低了資料的維護速度。

五、MySql索引的分類:

1、普通索引和唯一索引

普通索引:Mysql中最基礎的索引類型,允許在定義索引的列中插入重複值和空值。

唯一索引:索引列的值必須唯一,但允許有空值。

如果是組合索引,則列值群組合必須唯一。主鍵索引是一種特殊唯一索引,不行允許有空值。

2、單列索引群組合索引

  • 單列索引:一個索引隻包含一個列,一個表也可以有多個單列索引。
  • 組合索引:在表的多個字段組合上建立的索引,隻有在查詢條件中使用了這些字段的左邊字段時,索引才會被使用。使用組合索引時遵循最左字首集合。

3、全文索引

全文索引類型為FULLTEXT,在定義索引的列上支援值得全文查找,允許在這些索引列中插入重複值和空值。全文索引可以在CHAR,VARCHAR或者TEXT類型上建立。

隻有MyISAM存儲引擎支援全文索引。

4、空間索引

空間索引是對空間資料類型的字段建立索引,Mysql中的空間資料有4中:GEOMETRY、POINT、LINESTRING和POLYGON。Mysl使用SPATIAL關鍵字進行擴充,使得能夠建立正規索引類似的文法建立空間索引。

建立空間索引的列,必須将其聲明為NOT NULL,空間索引隻能在存儲引擎為MyISAM中建立。

access建立兩個字段唯一索引_前阿裡P7架構師的詳解MySQL——索引介紹一、定義:二、簡介:三、索引優點:四、索引的缺點:五、MySql索引的分類:六、索引表的設計原則:八、已存在表中建立索引:九、總結:推薦閱讀

六、索引表的設計原則:

1、索引表不是越多越好,一個表中如果有大量索引,不僅占用硬碟空間,還影響增删改查等語句的性能,因為當表中的資料更改的同時,索引也會進行調整和更新。

2、避免經常更新的表進行過多的索引,并且索引表中的列盡可能少。而經常查詢的字段應該建立索引,但要避免添加不必要的字段。

3、資料量小的表最好不要使用索引。周遊的時間短與索引的時候,并不會産生優化效果。

4、在條件表達式中經常用到的不同值較多的列上建立索引,在不同值少的列上不要建立索引。比如性别。

5、當唯一性是某種資料本身的特征時,指定唯一索引。使用唯一索引需要能確定定義的列的資料的完整性,以提高資料的查詢速度。

6、在頻繁進行排序或者分組(即進行group by 或order by操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。

建立文法:

CREATE TABLE 指定索引列ALTER TABLE 在存在的表上建立索引CREATE INDEX 添加索引CREATE TABLE table_name [col_name data_type][UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length]) [ASC|DESC]UNIQUE:唯一索引FULLTEXT:全文索引SPATIAL:空間索引[INDEX|KEY]:作用相同,建立索引col_name:需要建立索引的字段列,必須在表中定義的列index_name:指定索引名,如果不指定Mysql預設col_name為索引值。length:索引長度,僅字元串型才可指定[ASC|DESC]:升序、降序
           

1、建立普通索引:

mysql> create database lxqdb;mysql> use lxqdb;mysql> create table book-> (-> book_id int not null,-> book_name varchar(255) not null,-> authors varchar(255) not null,-> info varchar(255) null,-> comment varchar(255) null,-> year_publication year not null,-> INDEX(year_publication)-> );
           

檢視:

mysql> show create table book GKEY `year_publication` (`year_publication`) # 成功建立索引,mysql自動添加索引名:year_publication
           

檢視索引是否被正确使用:

mysql> explain select * from book where year_publication=2018G*************** 1. row ***********id: 1select_type: SIMPLE # 表示簡單的select,不可以使用子查詢。其他取值:PRIMARY | UNION | SUBQUERYtable: book # 行指定資料表名,它們被按照讀取的先後順序排列type: ref # 行指定本資料表和其他資料表之間的關聯。其他取值:system | const | eq_ref | ref | range | index | ALLpossible_keys: year_publication # 可以選用的索引key: year_publication # 實際選用的索引key_len: 1 # 索引按位元組計算長度,值越小表示越快ref: const # 關聯另一個資料表裡的列名rows: 1 # 執行查詢時預計會從這個資料表裡讀出的資料行的個數Extra: Using index condition # 關聯操作資訊1 row in set (0.00 sec)
           

2、建立唯一索引:

在比較大龐大的資料表中,為了減少索引列操作的時間。與普通索引唯一不同的是:索引列的值必須唯一,但允許有空值。如果是組合索引,則 列值的組合必須唯一。

建立tb1表,id字段使用UNIQUE建立唯一索引。

mysql> create table tb1-> (-> id int not null,-> name char(20) not null,-> UNIQUE INDEX uidx(id)-> );
           

檢視:

mysql> show create table tb1GUNIQUE KEY `uidx` (`id`) # id字段上建立了名為uidx的唯一索引。
           

3、建立單列索引:

單列索引是再資料表中某一字段上建立的索引,一個表中可以建立多個單列索引。

上面的兩個例子中建立的索引都是單列索引。

建立tb2表,在表中name字段上建立單列索引。

mysql> create table tb2-> (-> id int not null,-> name char(20) not null,-> INDEX Single_idx(name(10))-> );
           

檢視:

mysql> show create table tb2GKEY `Single_idx` (`name`(10)) # name字段上建立名為Single_idx且長度10的單列索引。
           

4、建立組合索引:

在多個字段上建立索引。

建立tb3表,id,name,age為索引

mysql> create table tb3-> (-> id int not null,-> name char(20) not null,-> age int not null,-> info varchar(255),-> INDEX Multi_idx(id,name,age)-> );
           

檢視:

mysql> show create table tb3GKEY `Multi_idx` (`id`,`name`,`age`) # 建立了組合索引注意:組合索引可起幾個索引的作用,但是使用時并不是随便查詢哪個字段都可以使用索引,而是遵從“最左字首”最左字首:利用索引中最左邊的列集來比對,索引中按idameage的順序存放,索引可以搜尋下面的字段組合:(id,name,age)、(id,name)、id。如果列不構成索引最左字首,mysql不能使用局部索引,如age或者name,age組合則不能使用索引。查詢id和name字段的索引情況:mysql> explain select * from tb3 where id=1 and name='lxq'Gkey: Multi_idx # 可以看到使用了MultiIdx的索引。查詢name和age字段的索引情況:mysql> explain select * from tb3 where name='lxq' and age=23Gkey: NULL # 表示并沒有使用索引查詢。
           

5、建立全文索引:

隻有myisam引擎支援且隻為char,varchar,text列。索引總是對整列進行,不支援局部索引。

建立表tb4,在info字段上建全文索引:

mysql> create table tb4-> (-> id int not null,-> name char(20) not null,-> age int not null,-> info varchar(255),-> FULLTEXT INDEX Fulltext_idx(info)-> )engine=myisam;
           

檢視:

mysql> show create table tb4GFULLTEXT KEY `Fulltext_idx` (`info`) # 名為Fulltext_idx的FULLTEXT。适合大型資料,不要在小資料内使用。
           

6、建立空間索引:

隻有myisam引擎支援且隻為not null列。

建立tb5表,GEOMETRY字段上建立空間索引:

mysql> create table tb5-> (-> gmt geometry not null,-> SPATIAL INDEX Spat_idx(gmt)-> )engine=myisam;
           

檢視:

mysql> show create table t5G;SPATIAL KEY `Spat_idx` (`gmt`) # 名為Spat_idx的GEOMETRY
           
access建立兩個字段唯一索引_前阿裡P7架構師的詳解MySQL——索引介紹一、定義:二、簡介:三、索引優點:四、索引的缺點:五、MySql索引的分類:六、索引表的設計原則:八、已存在表中建立索引:九、總結:推薦閱讀

我是分割線1

八、已存在表中建立索引:

1、在book表中的bookname字段上建bookname_idx的普通索引:

mysql> alter table book add index bookname_idx(book_name(30));
           

檢視:

mysql> show index from bookG************* 2. row *************Table: bookNon_unique: 1 # 索引非唯一,1代表非唯一索引,0代表唯Key_name: bookname_idx # 索引名Seq_in_index: 1 # 索引中的位置,1為單列,組合索引為每個字段在索引定義中的順序Column_name: book_name # 索引的列字段Collation: A Cardinality: 0Sub_part: 30 # 索引長度Packed: NULLNull: # 字段是否為空Index_type: BTREE # 索引類型Comment:Index_comment:Table: book
           

2、在bookid字段上建立名為UniqidIdx的唯一索引:

mysql> alter table book add UNIQUE INDEX Uniqid_idx(book_id);
           

檢視:

mysql> show index from book G;************** 1. row ***********Table: bookNon_unique: 0 # 索引唯一,1代表非唯一索引,0代表唯一索Key_name: Uniqid_idxSeq_in_index: 1
           

3、在comment上建立單列索引:

mysql> alter table book add INDEX coment_idx(comment(50));
           

檢視:

mysql> show index from book GSub_part: 50 #隻要檢索前50個字元
           

4、在book的authors和info上建組合索引:

mysql> alter table book add INDEX Au_Info_idx(authors(20),info(50));
           

檢視:

mysql> show index from book G;Key_name: Au_Info_idxSeq_in_index: 1 # 索引序列1Column_name: authors*******************************Key_name: Au_Info_idxSeq_in_index: 2 # 索引序列2Column_name: info
           

5、在tb6表gmt字段建空間索引:

建表:

mysql> create table tb6 ( gmt geometry not null)engine=myisam;
           

增加空間索引:

mysql> alter table tb6 add SPATIAL INDEX spat_idx(gmt);
           

檢視:

mysql>show index from tb6G
           

我是分割線2

檢視索引:

mysql> show create table book GUNIQUE KEY `Uniqid_idx` (`book_id`),KEY `year_publication` (`year_publication`),KEY `bookname_idx` (`book_name`(30)),KEY `coment_idx` (`comment`(50)),KEY `Au_Info_idx` (`authors`(20),`info`(50))或mysql>show index from bookG
           

删除索引:

mysql> alter table book drop index Uniqid_idx; # 删除索引名為Uniqid_idx的索引。
           

注意:

添加AUTO_INCREMENT限制字段的唯一索引不能被删除。

mysql> drop index coment_idx on book; # 删除book表内索引名為coment_idx的索引。
           

我是分割線3

九、總結:

1、索引對資料庫的如此重要,應該如何使用?

  • 為資料庫選擇正确的索引是一項複雜的任務。
  • 如果索引列較少,則需要的磁盤空間和維護開銷都較少。
  • 如果在一個大表上建立了多種組合索引,索引檔案也膨脹的很快。
  • 另一面索引較多可覆寫更多的查詢。
  • 删除建立索引不影響應用程式,也不影響資料庫架構,是以應嘗試多個不同的索引,進而建立最優的索引。

2、盡量使用短索引。

  • 對字元串類型的字段進行索引,如果可能應該指定一個字首長度。
  • 例如:有一個char(255)的列,如果在前10個或30個字元内,多數值是唯一的,則不需要對整個列進行索引。
  • 短索引不僅可以提高查詢速度而且可以節省磁盤空間、減少I/O操作。

3、是不是索引建立得越多越好?

  • 合理的索引可以提高查詢速度,但是不是索引越多越好。在執行插入語句的時候,mysql要為新插入的記錄建立索引,是以過多的索引會導緻插入操作變的非常慢。
  • 原則上是隻在查詢用的字段才建立索引。

4、為甚查詢語句中的索引沒有起作用?

  • 在一些情況下,查詢語句中使用了帶有索引字段。但索引字段沒有起作用。
  • 例如:在where 條件的like關鍵字比對的字元串以“%”開頭,這種情況下不會起作用。
  • where條件中使用or關鍵字連結條件,如果有1個字段沒有使用索引,那麼其他的索引也不會起作用。
  • 如果使用多列索引,但是沒有使用多列索引中的第一個字段,那麼多列索引也不會起作用。

Java肖先生:專注于Java開發技術的研究與知識分享!

————END————

  • 點贊(感謝)
  • ...
  • 轉發(感謝)
  • ...
  • 關注(感謝)
  • ...

推薦閱讀

Java程式員備戰“金九銀十”必備的面試技巧(附阿裡Java崗面試題)