mysql 索引的概念和操作

常用的索引分爲下面幾種:

key:普通索引

unique key:唯一索引

primary key:主鍵索引

full text:全文索引


創建表t8添加普通索引key和唯一索引unique key:

mysql> create table t8 ( id int, name char(10), email char(20),key name(name),unique key(email) );
Query OK, 0 rows affected (0.01 sec)

查看錶結構:

mysql> desc t8;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(10) | YES  | MUL | NULL    |       |
| email | char(20) | YES  | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

插入數據:

mysql> insert into t8 values ("1","lisi","[email protected]")
    -> ;
Query OK, 1 row affected (0.01 sec)

查詢數據:

mysql> select * from t8;
+------+------+----------------+
| id   | name | email          |
+------+------+----------------+
|    1 | lisi | [email protected] |
+------+------+----------------+
1 row in set (0.00 sec)


#unique key唯一性,[email protected]郵箱已經存在將不允許相同.

mysql> insert into t8 values ("2","lisi","[email protected]")
    -> ;
ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'email'


創建表t9,主鍵key:

mysql> create table t9 ( id int, name char(10), email char(20),primary key (id),key id (name),unique key(email) );
Query OK, 0 rows affected (0.04 sec)
mysql> desc t9;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | 0       |       |
| name  | char(10) | YES  | MUL | NULL    |       |
| email | char(20) | YES  | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

##索引的長度:建索引時,可以只索引列的前一部分的內容,比如前10個字符.

如 key id(email(10))

#索引email長度爲10個字符,並不是只允許表中email列插入長度爲10個字符,而是說索引引用時只引用emial列前面10個字符.

mysql> create table t10 ( id int, name char(10), email char(20),primary key (id),key id (email(10)),unique key(email) );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t10;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
| email | char(20) | YES  | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

#插入超過10個字符長度的email,發現也是可以的.

mysql> insert into t10 values (1,"lisi","[email protected]");
Query OK, 1 row affected (0.01 sec)


多列索引:把2個或者多列的值,看成一個整體,然後建立索引.

mysql> create table t11 (
    -> xing char(2),
    -> ming char(10),
    -> key xm(xing,ming)
    -> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t11;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| xing  | char(2)  | YES  | MUL | NULL    |       |
| ming  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into  t11 values ("李","世民");
Query OK, 1 row affected (0.00 sec)
mysql> select * from t11;
+------+--------+
| xing | ming   |
+------+--------+
| 李   | 世民   |
+------+--------+
1 row in set (0.00 sec)

查看錶t11的索引:

mysql> show index from t11 \G;
*************************** 1. row ***************************
        Table: t11
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 1
  Column_name: xing
    Collation: A
  Cardinality: 1
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: t11
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 2
  Column_name: ming
    Collation: A
  Cardinality: 1
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)
ERROR: 
No query specified


#多列索引的查詢。

mysql> select * from t11 where xing="李" and ming="世民";
+------+--------+
| xing | ming   |
+------+--------+
| 李   | 世民   |
+------+--------+
1 row in set (0.01 sec)

查看查詢所能使用的索引:explain

possible_keys :可能用到的key

key:查到的key.

mysql> explain select * from t11 where xing="李" and ming="世民";
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref         | rows | Extra                    |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
|  1 | SIMPLE      | t11   | ref  | xm            | xm   | 38      | const,const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
1 row in set (0.00 sec)
mysql> explain select * from t11 where xing="李";
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra                    |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | t11   | ref  | xm            | xm   | 7       | const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
mysql> explain select * from t11 where  ming="世民";
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | t11   | index | NULL          | xm   | 38      | NULL |    1 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
mysql> explain select * from t11 where  ming="世民" and xing="李";
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref         | rows | Extra                    |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
|  1 | SIMPLE      | t11   | ref  | xm            | xm   | 38      | const,const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
1 row in set (0.00 sec)

冗餘索引:在某個列上,可能存在多個索引.比如xm(xing,ming) m(ming).目的在於加快查詢速度.

mysql> create table t12 ( xing char(2), ming char(10), key xm(xing,ming),key m(ming) );
Query OK, 0 rows affected (0.02 sec)

查看錶t12所使用到的索引:

mysql> show index from t12;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t12   |          1 | xm       |            1 | xing        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| t12   |          1 | xm       |            2 | ming        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| t12   |          1 | m        |            1 | ming        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
mysql> show index from t12 \G;
*************************** 1. row ***************************
        Table: t12
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 1
  Column_name: xing
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: t12
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 2
  Column_name: ming
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: t12
   Non_unique: 1
     Key_name: m
 Seq_in_index: 1
  Column_name: ming
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
3 rows in set (0.00 sec)
ERROR: 
No query specified

#刪除索引.

語法:

alter table 表名 drop index 索引名

drop index 索引名 on 表名

mysql> alter table t12 drop index m;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> drop index xm on t12;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from t12 \G;
Empty set (0.00 sec)
ERROR: 
No query specified


添加索引

alter table 表名 add [index/unique] 索引名;
mysql> alter table t12 add index xm(xing,ming);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> alter table t12 add unique m(ming);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table t12;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                   |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t12   | CREATE TABLE `t12` (
  `xing` char(2) DEFAULT NULL,
  `ming` char(10) DEFAULT NULL,
  UNIQUE KEY `m` (`ming`),
  KEY `xm` (`xing`,`ming`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

添加主鍵索引

mysql> alter table t12 add primary key(xing);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

刪除主鍵索引

mysql> alter table t12 drop primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0



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