組合索引鍵

  1. 多鍵組合索引又比單鍵索引的搜尋速度快,如果常搜尋兩個欄位的話,最好設定成組合索引鍵。
  2. 產生測試資料表 indextab。
    MariaDB root@(none):dyw> create table indextab(id int unsigned not null,lname var
                          -> char(20),fname varchar(20),phone varchar(20));
    Query OK, 0 rows affected
    Time: 0.040s
    
  3. 查看資料表 indextab 的欄位特徵。
    MariaDB root@(none):dyw> desc indextab;
    +-------+------------------+------+-----+---------+-------+
    | Field | Type             | Null | Key | Default | Extra |
    +-------+------------------+------+-----+---------+-------+
    | id    | int(10) unsigned | NO   |     | <null>  |       |
    | lname | varchar(20)      | YES  |     | <null>  |       |
    | fname | varchar(20)      | YES  |     | <null>  |       |
    | phone | varchar(20)      | YES  |     | <null>  |       |
    +-------+------------------+------+-----+---------+-------+
    
    4 rows in set
    Time: 0.027s
    
  4. 設定 lname 及 fname 組合成名為 name 的索引鍵。
    MariaDB root@(none):dyw> alter table indextab add index name (lname, fname);
    You're about to run a destructive command.
    Do you want to proceed? (y/n): y
    Your call!
    Query OK, 0 rows affected
    Time: 0.045s
    
  5. 查詢資料表 indextbl 的索引鍵,有 lname 及 fname 組合的 name 索引鍵。
    MariaDB root@(none):dyw> show index from indextbl\G
    ***************************[ 1. row ]***************************
    Table         | indextbl
    Non_unique    | 1
    Key_name      | name
    Seq_in_index  | 1
    Column_name   | lname
    Collation     | A
    Cardinality   | 0
    Sub_part      | <null>
    Packed        | <null>
    Null          | YES
    Index_type    | BTREE
    Comment       |
    Index_comment |
    ***************************[ 2. row ]***************************
    Table         | indextbl
    Non_unique    | 1
    Key_name      | name
    Seq_in_index  | 2
    Column_name   | fname
    Collation     | A
    Cardinality   | 0
    Sub_part      | <null>
    Packed        | <null>
    Null          | YES
    Index_type    | BTREE
    Comment       |
    Index_comment |
    
    2 rows in set
    Time: 0.003s
    
  6. 新增兩筆資料。
    MariaDB root@(none):dyw> insert into indextab(id,lname,fname,phone) values (1,'wa
                          -> ng','dy','09123456'),(2,'lin','da','09234561');
    Query OK, 2 rows affected
    Time: 0.010s
    
  7. 使用 name 索引鍵查詢,但本範例僅兩筆資料,無法比對有無索引的搜尋速度差別。
    MariaDB root@(none):dyw> select * from indextab use index(name) where lname='wang
                          -> ' and fname='dy';
    +----+-------+-------+----------+
    | id | lname | fname | phone    |
    +----+-------+-------+----------+
    | 1  | wang  | dy    | 09123456 |
    +----+-------+-------+----------+
    
    1 row in set
    Time: 0.032s
    
  8. 如果資料表中設定多個索引,搜尋時可用 ignore 指定不使用某個索引鍵查詢,例如:不使用 name 索引鍵查詢。
    MariaDB root@(none):dyw> select * from indextab ignore index(name) where lname='w
                          -> ang' and fname='dy';
    +----+-------+-------+----------+
    | id | lname | fname | phone    |
    +----+-------+-------+----------+
    | 1  | wang  | dy    | 09123456 |
    +----+-------+-------+----------+
    
    1 row in set
    Time: 0.021s