經常使用的索引分爲下面幾種:mysql
key:普通索引sql
unique key:惟一索引ide
primary key:主鍵索引spa
full text:全文索引索引
建立表t8添加普通索引key和惟一索引unique key:ci
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)
查看錶結構:it
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)
插入數據:io
mysql> insert into t8 values ("1","lisi","lisi@email.com") -> ; Query OK, 1 row affected (0.01 sec)
查詢數據:table
mysql> select * from t8; +------+------+----------------+ | id | name | email | +------+------+----------------+ | 1 | lisi | lisi@email.com | +------+------+----------------+ 1 row in set (0.00 sec)
#unique key惟一性,lisi@email.com郵箱已經存在將不容許相同.class
mysql> insert into t8 values ("2","lisi","lisi@email.com") -> ; ERROR 1062 (23000): Duplicate entry 'lisi@email.com' 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","sqweqeqeq@email.com"); 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