MySQL(七)------ 索引的設計和使用

       索引是數據庫中用來提高性能的最常用工具,下面簡單介紹一下索引的類型和設計原則。

一、索引概述

常用引擎的索引方式
特點 MyISAM InnoDB MEMORY MERGE
B樹索引 支持(默認) 支持(默認) 支持 支持
哈希索引     支持(默認)  
全文索引 支持      
前綴索引 支持 支持    

       索引在創建表的時候可以同時創建,也可以隨時增加新的索引,創建新索引的語法爲:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name( col_name [(length)] [ASC|DESC])

       使用ALTER TABLE 語法來增加索引,與上面類似。

mysql> create index cityname on city (city(10));
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> explain select * from city where city = 'FUzhou' \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: city
   partitions: NULL
         type: ref
possible_keys: cityname
          key: cityname
      key_len: 32
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

           刪除索引的語法爲:

          DROP INDEX index_name ON tbl_name

mysql> drop index cityname on city;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

二、索引設計的原則

       下面列出的是一些已有的原則,創建索引時儘量遵守以便提升效率。

  • 最適合索引的列是出現在WHERE字句中的列,或連接字句中指定的列,而不是出現在SELECT關鍵字後選擇列表中的列。
  • 使用唯一索引;主要考慮索引列中值的唯一性,比如用生日列做索引搜索出來的結果往往比用性別做索引搜索出來的要好,因爲性別不管搜索哪個值都會出來一半結果。
  • 使用短索引;比如對較長字符串列進行索引,一般都是對一定長度的前綴進行索引,或是之前提到過的用散列值進行索引,這樣有助於減少磁盤IO,節省空間及內存,加快查詢速度。
  • 不要過度索引;索引不是越多越好,每個索引都要佔用額外的磁盤空間,並降低寫操作的性能,而且每當表內容有變化時索引都要進行更新,從而使得花費時間更長;所以只保留所需索引纔是最佳的。
  • 對於InnoDB類型的表,如果有主鍵則按主鍵順序保存;如果沒有主鍵但有唯一索引,那麼就按唯一索引的順序保存;如果兩個都沒有,那就會按表中自動生成的內部列的順序來保存。儘量定義主鍵,它的訪問速度最快,而且一般用最常作爲訪問條件的列做主鍵,且需要選擇較短的數據類型,這樣做都是爲了節省空間提高速度。

三、BTREE索引與HASH索引

      MEMORY類型表同時支持BTREE索引和HASH索引,這兩個索引也有一些不同的適應範圍。

HASH索引需要注意:

  • 只用於使用=或<=>操作符的等式比較;
  • 優化器不能使用HASH索引來加速ORDER BY操作;
  • 只能使用整個關鍵字來搜索一行;
  • 不能確定兩個值之間大約有多少行;

      而BTREE索引就可以使用範圍搜索和模糊搜索,並使用相關列上的索引。

看下面的例子:

下列範圍查找BTREE索引和HASH索引都適用:
select * from t1 where key_col=1,or key_col in (15,18,20);

下列範圍查詢只適合BTREE索引:
select * from t1 where key_col > 1 and key_col < 10;
select * from t1 where key_col like 'ab%' or key_col between 'lisa' and 'simon';

       當我們創建一個MEMORY類型的表時,默認使用的是HASH索引,而此時如果對索引字段進行範圍查找,此時的HASH沒有起到作用,實際上還是進行的全表掃描;只有將其改爲BTREE索引時纔可以有效通過索引來提高效率。

       因此,如果創建MEMORY表,就需要注意SQL語句的編寫確保能使用上索引;如果一定要使用範圍查詢,那麼應該創建成BTREE索引的表。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章