程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL心得5-1--索引

MySQL心得5-1--索引

編輯:MySQL綜合教程

  1.  MySQL有多中訪問表的行,其中最常用的是順序訪問和索引訪問。順序訪問就是:一行一行的浏覽一個表,即全表掃描。缺點:非常費時,效率很低。索引訪問是:只讀取那些表現了所需特性的行,其中包含了至少一個索引;與書上的目錄相似。   www.2cto.com   索引:就是一個列表,包含索引字段的值和相應的頁碼定位。   索引關鍵字進行了排序。查詢時可以通過索引,提供查詢速度.對於索引的每一項,MySQL在內部為它保存一個數據文件中實際記錄所在位置的指針。   索引的優點:提供查詢速度。   缺點:占磁盤空間 ;  會降低寫的速度。(插入,更新,刪除)   什麼時候鍵索引:如果表主要是提供查詢,那麼在經常查詢的字段上建立索引。   索引弊端:   1)首先,索引是以文件的形式存儲的,索引文件要占用磁盤空間。如果有大量的索引,索引文件可能會比數據文件更快地達到最大的文件尺寸。   2)其次,在更新表中索引列上的數據時,對索引也需要更新,這可能需要重新組織一個索引,如果表中的索引很多,這是很浪費時間的。也就是說,這樣就降低了添加、刪除、修改和其他寫入操作的效率。表中的索引越多,則更新表的時間就越長。   但是這些弊端並不妨礙索引的應用,因為索引帶來的好處已經基本掩蓋了它的缺陷,在表中有很多行數據的時候,索引通常是不可缺少的。   www.2cto.com   在數據庫中建立索引主要有以下好處:   1).快速讀取數據;   2).保證數據記錄的唯一性;   3).實現表與表之間的參照完整性;   4)在使用group by、order by字句進行數據檢索時,利用索引可以減少排序和分組的時間   2.   索引的分類   目前大部分MySQL索引都是以B-樹(BTREE)方式存儲的。btree方式構建為包含了多個節點的一棵樹。頂部的節點構成了索引的開始點,叫做根。每個節點中含有索引列的幾個值,節點中的每個值又都指向另一個節點或者指向表中的一行,一個節點中的值必須是有序排列的。指向一行的節點叫做葉子頁。葉子頁本身也是相互連接的,一個葉子頁有一個指針指向下一組。這樣,表中的每一行都會在索引中有一個對應值。查詢的時候就可以根據索引值直接找到所在的行。   索引中的節點是存儲在文件中的,所以索引也是要占用物理空間的,MySQL將一個表的索引都保存在同一個索引文件中。   如果更新表中的一個值或者向表中添加或刪除一行,MySQL會自動地更新索引,因此索引樹總是和表的內容保持一致。   索引是對象,刪除對象用drop,刪除記錄用delete。   3.按BTREE形式存儲的主要索引類型介紹如下:   1).  普通索引(index)   這是最基本的索引類型,它沒有唯一性之類的限制。創建普通索引的關鍵字是INDEX。   www.2cto.com   create index 索引名 on 表名(字段名,。。。);      例如:create indexindex_name on xs(姓名);   2).  唯一性索引(unique)   這種索引和前面的普通索引基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須是唯一的。創建唯一性索引的關鍵字是UNIQUE。   在一個表上可以創建多個,索引值不能重復,允許有空值   create unique index 索引名 on 表名(字段名,。。。)   3).  主鍵(primary key)   主鍵是一種唯一性索引,它必須指定為“PRIMARY KEY”。主鍵一般在創建表的時候指定,也可以通過修改表的方式加入主鍵。但是每個表只能有一個主鍵。   在一個表上只能創建一個主鍵,主鍵字段不能出現重復值,不允許為空。   4).  全文索引(fulltext)        MySQL支持全文檢索和全文索引。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引只能在VARCHAR或TEXT類型的列上創建,並且只能在MyISAM表中創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對於大規模的數據集,通過ALTER TABLE(或CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。        另外,當表類型為memory或heap時,除了BTREE索引,MySQL還支持哈希索引(HASH)。使用哈希索引,不需要建立樹結構,但是所有的值都保存在一個列表中,這個列表指向相關頁和行。當根據一個值獲取一個特定的行時,哈希索引非常快。   create fulltext index 索引名 on 表名(字段名,。。。);   4.  使用create index語句   使用CREATE INDEX語句可以在一個已有表上創建索引,一個表可以創建多個索引。語法格式:   create [unique | fulltext |spatial] index index_name      [using index_type]  www.2cto.com        on tbl_name (index_col_name,...)   其中,index_col_name格式為:col_name [(length)] [ASC | DESC]   說明:   ●   index_name:索引的名稱,索引在一個表中名稱必須是唯一的。   ●  USING index_type:部分存儲引擎允許在創建索引時指定索引的類型。index_type為存儲引擎支持的索引類型的名稱,MySQL支持的索引類型有BTREE和HASH。如果不指定USING子句,MySQL自動創建一個BTREE索引。   ●  index_col_name:col_name表示創建索引的列名。length表示使用列的前length個字符創建索引。使用列的一部分創建索引可以使索引文件大大減小,從而節省磁盤空間。在某些情況下,只能對列的前綴進行索引。例如,索引列的長度有一個最大上限,因此,如果索引列的長度超過了這個上限,那麼就可能需要利用前綴進行索引。BLOB或TEXT列必須用前綴索引。前綴最長為255字節,但對於MyISAM和InnoDB表,前綴最長為1000字節。   另外還可以規定索引按升序(ASC)還是降序(DESC)排列,默認為ASC。如果一條SELECT語句中的某列按照降序排列,那麼在該列上定義一個降序索引可以加快處理速度。   ●   UNIQUE | FULLTEXT | SPATIAL:UNIQUE表示創建的是唯一性索引;FULLTEXT表示創建全文索引;SPATIAL表示為空間索引,可以用來索引幾何數據類型的列。本書不討論SPATIAL索引。   可以看出,CREATEINDEX語句並不能創建主鍵。   例:根據XS表的學號列上的前5個字符建立一個升序索引XH­_XS。   CREATE INDEX XH_XS  ON   XS(學號(5)  ASC);   可以在一個索引的定義中包含多個列,中間用逗號隔開,但是它們要屬於同一個表。這樣的索引叫做復合索引。   例: 在XS_KC表的學號列和課程號列上建立一個復合索引XSKC­_IN。   CREATE INDEX  XSKC_IN  ON  XS_KC(學號,課程號);   5.  使用ALTER TABLE語句   前面介紹了如何使用ALTER TABLE語句修改表,其中也包括向表中添加索引。 語法格式如下:   ALTER [IGNORE] TABLEtbl_name   add index [索引名] [索引類型] (索引列,...)  /*添加索引*/    | add [constraint [symbol]] primary key [索引類型] (索引列,...)                                      /*添加主鍵*/  www.2cto.com      | add [CONSTRAINT [symbol]]UNIQUE [index_name][index_type] (index_col_name,...)                   /*添加唯一性索引*/    | add [FULLTEXT | SPATIAL] [索引名] (索引列,...)                                      /*添加全文索引*/    | add [CONSTRAINT [symbol]] foreign key [索引名] (索引列,...)[reference_definition]                /*添加外鍵*/    | disable keys    | enable keys   說明:   ●   index_type:語法格式為USING{BTREE | HASH}。   當定義索引時默認索引名,則一個主鍵的索引叫做“PRIMARY”,其他索引使用索引的第一個列名作為索引名。如果存在多個索引的名字以某一個列的名字開頭,就在列名後面放置一個順序號碼。   ●  constraint [symbol]:為主鍵、UNIQUE鍵、外鍵定義一個名字。以下也有用到。這個將在命名完整性約束一節中介紹。   ●  disable keys| enable keys:只在MyISAM表中有用,使用ALTER TABLE...DISABLE KEYS可以讓MySQL在更新表時停止更新MyISAM表中的非唯一索引,然後使用ALTER TABLE ... ENABLE KEYS重新創建丟失的索引,這樣可以大大地加快查詢的速度。   例: 在XS表的姓名列上創建一個非唯一的索引。   ALTER TABLE XS ADD INDEX XS_XM USING BTREE (姓名);   例: 以XS表為例(假設XS表中主鍵未定),創建這樣的索引,以加速表的檢索速度:   ALTER TABLE XS ADD PRIMARY KEY(學號),       ADD INDEX mark(出生日期,性別);   這個例子中,既包括PRIMARY KEY,也包括復合索引,說明MySQL可以同時創建多個索引。記住:使用PRIMARY KEY的列,必須是一個具有NOT NULL屬性的列。  www.2cto.com     如果想要查看表中創建的索引的情況,可以使用show index from索引名 語句,例如:SHOW INDEX FROM XS;   6.  在創建表時創建索引   在前面兩種情況下,索引都是在表創建之後創建的。索引也可以在創建表時一起創建。在創建表的CREATE TABLE語句中可以包含索引的定義。   語法格式:   Create [temporary] table [IF NOT EXISTS] 表名      [ ( [字段名] , ... |[index_definition] ) ]      [table_option] [select_statement];   其中,index_definition為索引項:    [constraint [symbol]]PRIMARY KEY [索引類型] (索引列,...)                                                  /*主鍵*/   | {INDEX | KEY}[索引名] [索引類型] (索引列,...) /*索引*/   | [constraint [symbol]] UNIQUE [INDEX] [索引名] [索引類型] (索引列,...)                                 /*唯一性索引*/   | [FULLTEXT|SPATIAL][INDEX] [索引類型] (索引列,...)                                                /*全文索引*/  www.2cto.com     | [constraint [symbol]] foreign KEY  [索引類型] (索引列,...) [reference_definition]                       /*外鍵*/   說明:KEY通常是INDEX的同義詞。在定義列選項的時候,也可以將某列定義為PRIMARYKEY,但是當主鍵是由多個列組成的多列索引時,定義列時無法定義此主鍵,必須在語句最後加上一個PRIMARY KEY(col_name,…)子句。   例:創建XS_KC表的語句如下,XS_KC表帶有學號和課程號的聯合主鍵,並在成績列上創建索引。   CREATE TABLE XS_KC(           學號   CHAR(6) NOT NULL,           課程號 CHAR(3) NOT NULL,           成績   TINYINT(1),           學分    TINYINT(1),           PRIMARY KEY(學號,課程號),INDEX CJ(成績));   7.  1).  使用DROP INDEX語句刪除索引   語法格式:DROP INDEX index_name ON tbl_name   這個語句語法非常簡單,index_name為要刪除的索引名,tb1_name為索引所在的表。   例: 刪除XS表上的XS_XH索引。   DROP INDEX XS_XH ON XS;   2).  使用ALTER TABLE語句刪除索引   語法格式:   ALTER [ignore] TABLE tbl_name    | DROP PRIMARY KEY                     /*刪除主鍵*/    | DROP INDEX index_name                /*刪除索引*/    | DROP FOREIGN KEY fk_symbol           /*刪除外鍵*/   其中,DROP INDEX子句可以刪除各種類型的索引。使用DROP PRIMARY KEY子句時不需要提供索引名稱,因為一個表中只有一個主鍵。   www.2cto.com   例: 刪除XS表上的主鍵和mark索引。   ALTER TABLE XS DROP PRIMARY KEY, DROP INDEX mark;   如果從表中刪除了列,則索引可能會受到影響。如果所刪除的列為索引的組成部分,則該列也會從索引中刪除。如果組成索引的所有列都被刪除,則整個索引將被刪除。   當執行涉及多個表的連接查詢時,索引將更有價值。   8.  索引的三種創建方法總結:   1.表已經建好了:      1) create index 索引名  on 表名(字段名,。。);      2)  alter table 表名  add index  索引名(字段名,。。。);   2.在建表的同時創建索引   1)  直接指出主鍵:    create table abc   (id int primary key,   name varchar(10),   index ind_name(name));   2). 後面再指出主鍵:   create table abc1   www.2cto.com   (id int ,     name varchar(10),   primary key(id),   index ind_name(name));
    作者 tianyazaiheruan

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved