1. 索引简介
数据库对象索引其实与书的目录非常相似,主要是为了提高从表中检索数据的速度。由于数据存储在数据库表中,所以索引是创建在数据库表对象上的,由表中的一个或者多个字段生成的键组成,这些键存储在数据结构中,通过MySql可以快速有效的查询与键值相关联的字段,适合创建索引的情有:
(1)经常被查询的字段,即在where子句中出现的字段。
(2)在分组的字段,即在group by子句中出现的字段
(3)存在依赖关系的子表和父表之间的联合查询,即主键或外键字段。
MySql支持6中索引,他们分别是普通索引,唯一索引,全文索引,单列索引,多列索引和空间索引。
2. 创建和查看索引
2.1 创建和查看普通索引
普通索引:在创建索引是,不附加任何限制条件(唯一,非空等限制)。该类型索引可以创建在任何数据类型的字段上。
2.1.1 创建表时创建索引
语法形式如下:
create table table_name(属性名 属性类型,
属性名 属性类型,
......
属性名 属性类型,
index|key 【索引名】(属性名1 【(长度)】【desc|asc】));
示例:将t_dept设置为普通索引:mysql> create table t_dept(deptno INT,deptname VARCHAR(20),deptleader VARCHAR(20),index index_deptno(deptno));
Query OK, 0 rows affected (0.02 sec)
mysql> desc t_dept;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| deptno | int(11) | YES | MUL | NULL | |
| deptname | varchar(20) | YES | | NULL | |
| deptleader | varchar(20) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
为了检验索引是否被成功创建,可以执行SQL语句show create table,具体如下:mysql> show create table t_dept \G
*************************** 1. row ***************************
Table: t_dept
Create Table: CREATE TABLE `t_dept` (
`deptno` int(11) DEFAULT NULL,
`deptname` varchar(20) DEFAULT NULL,
`deptleader` varchar(20) DEFAULT NULL,
KEY `index_deptno` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
为了检验数据库t_dept中索引是否被使用,执行SQL语句EXPLAIN,具体语句如下:
mysql> explain select * from t_dept where deptno=1 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t_dept
partitions: NULL
type: ref
possible_keys: index_deptno
key: index_deptno
key_len: 5
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.01 sec)
可以看到索引index_deptno已经被使用了。2.1.2 在已经存在的表上创建索引
语法形式如下:
create index 索引名 on 表名(属性名【(长度)】 【asc|desc】);
示例:在表t_dept上使用deptname创建一个名为index_deptno的索引:
mysql> create index index_deptname on t_dept(deptname);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t_dept \G
*************************** 1. row ***************************
Table: t_dept
Create Table: CREATE TABLE `t_dept` (
`deptno` int(11) DEFAULT NULL,
`deptname` varchar(20) DEFAULT NULL,
`deptleader` varchar(20) DEFAULT NULL,
KEY `index_deptno` (`deptno`),
KEY `index_deptname` (`deptname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
2.1.3 通过SQL语句ALTER TABLE创建普通索引
语法形式如下:
alter table table_name add index|key 索引名(属性名【(长度)】【asc|desc】);
示例:在表t_dept上使用deptleader创建一个名为index_deptleader的索引:mysql> alter table t_dept add index index_deptleader(deptleader);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t_dept \G
*************************** 1. row ***************************
Table: t_dept
Create Table: CREATE TABLE `t_dept` (
`deptno` int(11) DEFAULT NULL,
`deptname` varchar(20) DEFAULT NULL,
`deptleader` varchar(20) DEFAULT NULL,
KEY `index_deptno` (`deptno`),
KEY `index_deptname` (`deptname`),
KEY `index_deptleader` (`deptleader`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
2.2 创建和查看唯一索引
唯一索引:创建索引时,限制索引的值必须时唯一的,通过该类型创建的索引可以更快速的查询某条记录。根据创建索引的方式,可以分为自动索引和手动索引。自动索引就是指在在数据库里设置完整性约束时,该表会被系统自动床架索引。手动索引就是指手动在表上创建索引。当在表中设置某个字段为主键或者唯一完整性约束时,系统就会自动创建关联该字段的唯一索引。
2.2.1 创建表示创建唯一索引:
语法形式:
create table table_name(属性名 属性类型,
属性名 属性类型,
......
属性名 属性类型,
unique index|key 【索引名】(属性名1 【(长度)】【desc|asc】));
示例如下:mysql> create table t_dept(deptno INT,deptname VARCHAR(20),deptleader VARCHAR(20),unique index index_deptno(deptno));
Query OK, 0 rows affected (0.02 sec)
mysql> show create table t_dept \G
*************************** 1. row ***************************
Table: t_dept
Create Table: CREATE TABLE `t_dept` (
`deptno` int(11) DEFAULT NULL,
`deptname` varchar(20) DEFAULT NULL,
`deptleader` varchar(20) DEFAULT NULL,
UNIQUE KEY `index_deptno` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
2.2.2 在已存在的表上创建唯一索引
语法形式如下:
create unique index 索引名 on 表名(属性名【(长度)】 【asc|desc】);
示例略。
2.2.3 通过SQL语句ALTER TABLE创建唯一索引
语法形式如下:
alter table table_name add unique index|key 索引名(属性名【(长度)】【asc|desc】);
示例略。
2.3 创建和查看全文索引
全文索引:主要关联在数据类型为CHAR,VARCHAR和TEXT的字段上,以便能够更加快速的查询数据量较大的字符串类型的字段。
2.3.1 在创建表时创建全文索引:
语法形式如下:
create table table_name(属性名 属性类型,
属性名 属性类型,
......
属性名 属性类型,
fulltext index|key 【索引名】(属性名1 【(长度)】【desc|asc】));
示例略。
2.3.2 在已存在的表上创建全文索引
语法形式如下:
create fulltext index 索引名 on 表名(属性名【(长度)】 【asc|desc】);
示例略。
2.3.3 通过SQL语句ALTER TABLE创建全文索引
语法形式如下:
alter table table_name add fulltext index|key 索引名(属性名【(长度)】【asc|desc】);
示例略。
2.4 创建和查看多列索引
多列索引:指定索引时,所关联的字段不是一个字段,而是多个字段。虽然可以通过所关联的字段进行查询,但是只有查询条件中使用了所关联字段中的第一个字段,所列索引才会被使用。
2.4.1 在创建表时创建多列索引
语法形式如下:
create table table_name(属性名 属性类型,
属性名 属性类型,
......
属性名 属性类型,
index|key 【索引名】(属性名1 【(长度)】【desc|asc】),
....
(属性名n 【(长度)】【desc|asc】),
示例略。
2.4.2 在已存在的表上创建索引
语法形式如下:
create fulltext index 索引名 on 表名(属性名【(长度)】 【asc|desc】,
.......
属性名【(长度)】 【asc|desc);
示例略。
2.4.3 通过SQL语句ALTER TABLE创建多列索引
语法形式:
alter table table_name add fulltext index|key 索引名(属性名【(长度)】【asc|desc】
......
属性名【(长度)】【asc|desc】);
示例略。
2.5 删除索引
语法形式:
drop index index_name on table_name;
示例:删除t_dept的index_deptno索引:mysql> show create table t_dept \G
*************************** 1. row ***************************
Table: t_dept
Create Table: CREATE TABLE `t_dept` (
`deptno` int(11) DEFAULT NULL,
`deptname` varchar(20) DEFAULT NULL,
`deptleader` varchar(20) DEFAULT NULL,
UNIQUE KEY `index_deptno` (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> drop index index_deptno on t_dept;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t_dept \G
*************************** 1. row ***************************
Table: t_dept
Create Table: CREATE TABLE `t_dept` (
`deptno` int(11) DEFAULT NULL,
`deptname` varchar(20) DEFAULT NULL,
`deptleader` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql>