MySQL資料庫索引簡介

做個安分守己的陳某某發表於2018-03-16
一、索引的含義和特點
    索引是一個單獨的、儲存在磁碟上的資料庫結構,他們包含著對資料表裡所有記錄的引用指標。使用索引用於快速找出某個或多個列中有一特點值的行,所用MySQL列型別都可以被索引,對相關列使用索引是提高查詢操作速度的最佳途徑。
    索引是在儲存引擎中實現的,因此,每種儲存引擎的索引都不一定完全相同,並且每種儲存引擎也不一定支援所有索引型別。根據儲存引擎定義每個表的最大索引數和最大索引長度。所有儲存殷勤支援每個表至少16個索引,總索引長度至少為256位元組。大多數儲存引擎有更高的限制。MySQL中索引的儲存型別有兩種:BTREE和HASH,具體和表的儲存引擎相關:MyISAM和InnoDB儲存殷勤只支援BTREE索引;MEMORY/HEAP儲存引擎可以支援HASH和BTREE索引。
    索引的優點主要有:
    (1)通過建立唯一索引,可以保證資料庫表中每一行資料的唯一性。
    (2)可以大大加快資料的查詢速度。
    (3)在實現資料的參考完整性方面,可以加速表和表之間的連線。
    (4)在使用分組和排序子句進行資料查詢時,也可以顯著減少查詢中分組和排序的時間。
    索引的缺點主要有:
    (1)建立索引和維護索引要耗費時間,並且隨著資料量的增加所耗費的時間也會增加。
    (2)索引需要佔磁碟空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果有大量的索引,索引檔案可能比資料檔案更快達到最大檔案尺寸。
    (3)當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
 
二、索引的分類
    MySQL的索引可以分為以下幾類:
    1、普通索引和唯一索引
    普通索引是MySQL中的基本索引型別,允許在定義索引的列中插入重複值和空值。
    唯一索引,索引列的值必須唯一,單允許有空值。如果是組合索引,則列值的組合必須唯一。主鍵索引是一種特殊的唯一索引,不允許有空值。
    2、單列索引和組合索引
    單列索引即一個索引只包含單個列,一個表可以有多個單個索引。
    組合索引指在表的多個欄位組合上建立的索引,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用。使用組合索引時遵循最左字首集合。
    3、全文索引
    全文索引型別為FULLTEXT,在定義索引的列上支援值得全文查詢,允許在這些索引列中插入重複值和空值。全文索引可以在CHAR、VARCHAR或者TEXT型別的列上建立。MySQL中只有MyISAM儲存引擎支援全文索引。
    4、空間索引
    空間索引是對空間資料型別的欄位建立的索引,MySQL中的空間資料型別有4中,分別是:GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL關鍵字進行擴充套件,使用能夠用於建立正規索引類似的語法建立空間索引。建立空間索引的列,必須將其宣告為NOT NULL,空間索引只能在儲存引擎為MyISAM的表中建立。
 
三、索引的設計原則
    索引設計不合理或者缺少索引都會對資料庫和應用程式的效能造成障礙。高效的索引對於獲得良好的效能非常重要。
    設計索引時,應該考慮的一些準則:
    (1)索引並非越多越好,一個表中如有大量的索引,不僅佔用磁碟空間,而且會影響INSERT、DELETE、UPDATE等語句的效能,因為表中的資料更改的同時,索引也會進行調整和更新。
    (2)避免對經常更新的表進行過多的索引,並且索引中的列儘可能少。而對經常用於查詢的欄位應該建立索引,單要避免新增不必要的欄位。
    (3)資料量小的表最好不要使用索引,由於資料較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。
    (4)在條件表示式中經常用到的不同值較多的列建立索引,在不同值少的列上不要建立索引。比如在學生表的“性別”欄位上只有“男”和“女”兩個不同值,因此就無須建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重較低更新速度。
    (5)當唯一性是某種資料本身的特徵時,指定唯一索引。使用唯一索引需能確保定義的列的資料完整性,以提高查詢速度。
    (6)在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。
 
四、建立索引
    1、建立表的時候建立索引
    使用CREATE TABLE建立表時,除了可以定義列的資料型別,還可以定義主鍵約束、外來鍵約束或者唯一約束,而不論建立那種約束,在定義約束的同時相當於在指定列上建立了一個索引。
    (1)建立普通索引
    最基本的索引型別,沒有唯一性之類的限制,其作用只是加快對資料的訪問速度。
    eg:
    CREATE TABLE book (
        bookid INT NOT NULL,
        bookname VARCHAR(255) NOT NULL,
        authors VARCHAR(255) NOT NULL,
        info VARCHAR(255),
        comment VARCHAR(255),
        year_publication YEAR NOT NULL,
        INDEX(year_publication)
    );
 
    (2)建立唯一索引
    建立索引的主要原因是減少查詢索引列操作的時間,尤其是對比較龐大的資料表。它與前面的普通索引類似,不同就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值得組合必須唯一。
    eg:
    CREATE TABLE t1 (
        id INT NOT NULL,
        name CHAR(30) NOT NULL,
        UNIQUE INDEX UniqIdx(id)
    );
 
    (3)建立單列索引
    單列索引是在資料表中的某一個欄位上建立的索引,一個表可以闖將多個單列索引。上面兩個例子中建立都是單列索引。
    eg:
    CREATE TBALE t2 (
        id INT NOT NULL,
        name CHAR(50),
        INDEX SingleIdx(name(20)) —-名為SingleIdx的單列索引,索引長度為20
    );
 
    (4)建立組合索引
    組合索引是在多個欄位上建立一個索引。
    eg:
    CREATE TABLE t3 (
        id  INT NOT NULL,
        name CHAR(30) NOT NULL,
        age INT NOT NULL,
        info VARCHAR(255),
        INDEX MultiIdx(id, name, age(100))
    );
    組合索引可起幾個索引的作用,但是使用時並不是隨便查詢那個欄位都可以使用索引,而是遵從“最左字首”:利用索引中最左邊的列集類匹配行,這樣的列集稱為最左字首。例如這裡由id、name和age3個欄位構成的索引,索引行中按id/name/age的順序存放,索引可以搜尋下面欄位組合:(id,name, age)、(id,name)或者id,如果列不構成索引最左面的字首,MySQL不能使用區域性索引,如(age)或者(name,age)組合不能使用索引查詢。
 
    (5)建立全文索引
    FULLTEXT全文索引可以用於全文搜尋。只用MyISAM儲存引擎支援FULLTEXT索引,並且只為CHAR、VARCHAR和TEXT列。索引總是對整個列進行,不支援區域性(字首)索引。
    eg:
    CREATE TABLE t4 (
        id INT NOT NULL,
        name CHAR(30) NOT NULL,
        age INT NOT NULL,
        info VARCHAR(255),
        FULLTEXT INDEX FullTxtIdx(info)
    ) ENGINE=MyISAM;
 
    (6)建立空間索引
    空間索引必須在MyISAM型別的表中建立,且空間型別的欄位必須為非空。
    eg:
    CREATE TABLE t5 (
        g GEOMETRY NOT NULL,
        SPATIAL INDEX spatIdx(g) 
    ) ENGINE=MyISAM;
    
    2、在已經存在的表上建立索引
      在已經存在的表中建立索引,可以使用ALTER TABLE或者CREATE INDEX語句。
      使用ALTER TABLE語句:
       ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name](col_name[length],…)[ASC|DESC]
      使用CREATE INDEX語句:
       CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name(col_name[length,…)[ASC|DESC]
 
三、刪除索引
    使用ALTER TABLE語句刪除索引:
     ALTER TABLE table_name DROP INDEX index_name;
    使用DROP INDEX語句刪除索引:
     DROP INDEX index_name ON table_name;
 
四、檢視索引
    SHOW INDEX FROM table_name;
    SHOW KEYS FROM table_name;
 

相關文章