1. 程式人生 > >MySql索引學習總結

MySql索引學習總結

常用 gin 深入 其中 條件 講解 成本 搜索 速查

1、索引是什麽

  索引(Index)是幫助MySQL高效獲取數據的數據結構。可以得到索引的本質:索引是數據結構。

  可以理解為“排好序的快速查找數據結構”

  在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,

  這樣就可以在這些數據結構上實現高級查找算法,這種數據結構就是索引。

2、優勢

  類似大學圖書館建書目索引,提高數據檢索效率,降低數據庫的IO成本。

  通過索引對數據進行排序,降低數據排序的成本,降低了CPU的消耗。

3、劣勢

  實際上索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄,所以索引列也是要占空間的。

  雖然索引大大提高了查詢速度,同時確會降低更新表的速度,如對表進行INSERT、UPDATE、DELETE。

  因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件每次更新添加了索引列的字段。

  都會調整因為更新所帶來的鍵值變化後的索引信息。

4、索引的分類  

  註意:索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引

      MyISAM和InnoDB存儲引擎:只支持BTREE索引, 也就是說默認使用BTREE,不能夠更換

      MEMORY/HEAP存儲引擎:支持HASH和BTREE索引

   1、索引我們分為四類來講 單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引、

     1.1、單列索引:一個索引只包含單個列,但一個表中可以有多個單列索引。 這裏不要搞混淆了。

        1.1.1、普通索引:

            MySQL中基本索引類型,沒有什麽限制,允許在定義索引的列中插入重復值和空值,純粹為了查詢數據更快一點。

        1.1.2、唯一索引:

            索引列中的值必須是唯一的,但是允許為空值,

        1.1.3、主鍵索引:

            是一種特殊的唯一索引,不允許有空值。

     1.2、組合索引

        在表中的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引才會被使用,使用組合索引時遵循最左前綴集合。這個如果還不明白,等後面舉例講解時在細說;例如,這裏由id、name和age3個字段構成的索引,索引行中就按id/name/age的順序存放,索引可以索引下面字段組合(id,name,age)、(id,name)或者(id)。如果要查詢的字段不構成索引最左面的前綴,那麽就不會是用索引,比如,age或者(name,age)組合就不會使用索引查詢。

     1.3、全文索引

       全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引,介紹了要求,說說什麽是全文索引,就是在一堆文字中,通過其中的某個關鍵字等,就能找到該字段所屬的記錄行,比如有"你是個大煞筆,二貨 ..." 通過大煞筆,可能就可以找到該條記錄。這裏說的是可能,因為全文索引的使用涉及了很多細節,我們只需要知道這個大概意思,如果感興趣進一步深入使用它,那麽看下面測試該索引時,會給出一個博文,供大家參考。

       註意:在使用全文搜索時,需要借助MATCH函數,並且其全文搜索的限制比較多,比如只能通過MyISAM引擎,比如只能在CHAR,VARCHAR,TEXT上設置全文索引。比如搜索的關鍵字默認至少要4個字符,比如搜索的關鍵字太短就會被忽略掉。等等,如果你們在實驗的時候可能會實驗不出來。

            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;

                SHOW CREATE TABLE t4\G;

       SELECT * FROM t4 WHERE MATCH(info) AGAINST(‘gorlr‘);

       EXPLAIN SELECT * FROM t4 WHERE MATCH(info) AGAINST(‘gorlr‘);

     1.4、空間索引

       空間索引是對空間數據類型的字段建立的索引,MySQL中的空間數據類型有四種,GEOMETRY、POINT、LINESTRING、POLYGON。

       在創建空間索引時,使用SPATIAL關鍵字。

       要求,引擎為MyISAM,創建空間索引的列,必須將其聲明為NOT NULL。具體細節看下面

5、基本語法

   alter table tbl_name add primary key(column_list); 添加主鍵索引 ,必須唯一且不能為NULL。

   alter table tbl_name add unique index_name(column_list);添加唯一索引,不能為NULL。

   alter table tbl_name add index_name(column_list); 添加普通索引,索引值可出現多次。

   alter table tbl_name add fulltext index_name(column_list); 添加全文索引FULLTEXT。 

6、MySQL索引結構

    BTree索引

    Hash索引

    full-text全文索引

    R-Tree索引

7、哪些情況需要創建索引

    1主鍵自動建立唯一索引

    2頻繁作為查詢條件的字段應該創建索引

    3查詢中與其他表關聯的字段,外鍵關系建立索引

    4頻繁更新的字段不適合建立索引,因為每次更新不單單是更新了記錄還會更新索引

    5WHERE條件裏用不到的字段不創建索引

    6單鍵/組合索引的選擇問題,who?(在高並發下傾向創建組合索引)

    7查詢中排序的字段,排序的字段若通過索引去訪問將大大提高排序速度

    8查詢中統計或者分組字段 

9對經常更新的表就避免對其進行過多的索引,對經常用於查詢的字段應該創建索引,

    10數據量小的表最好不要使用索引,因為由於數據較少,可能查詢全部數據花費的時間比遍歷索引的時間還要短,索引就可能不會產生優化效果。

    11在一同值少的列上(字段上)不要建立索引,比如在學生表的"性別"字段上只有男,女兩個不同值。相反的,在一個字段上不同值較多可是建立索引。

8、哪些情況不要創建索引

  ①表記錄太少

  ②經常增刪改的表

    提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE、和DELETE。

    因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。

    數據重復且分布平均的表字段,因此應該只為最經常查詢和最經常排序的數據建立索引。

  ③註意,如果某個數據列包含許多重復的內容,為它建立索引就沒有太大的實際效果。

MySql索引學習總結