目录
- 索引简介
- 索引创建的优缺点
- 创建索引
- 删除索引
索引简介
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
-----------------------------------------------------------------------------------------------------------------------------《百度百科》
索引创建的优缺点
优点
1.在设计数据库时,通过创建一个唯一的索引,能够在索引和信息之间形成一对一的映射式的对应关系,增加数据的惟一性特点。
2.能提高数据的搜索及检索速度,符合数据库建立的初衷。
3.能够加快表与表之间的连接速度,这对于提高数据的参考完整性方面具有重要作用。
4.在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有效的减少检索过程中所需的分组及排序时间,提高检索效率。
5.建立索引之后,在信息查询过程中可以使用优化隐藏器,这对于提高整个信息检索系统的性能具有重要意义。
缺点
1.创建索引和维护索引要耗费时间,并且随着数据的增多耗费的时间也会随之增加。
2.索引需要占用磁盘空间,索引还会占用一定物理空间,随着索引量的增加所占用的空间还将进一步的增加。
3.当对表中的数据进行增加删除和修改时,索引也需要进行维护,这就降低了维护速度。
创建索引
1.创建普通索引
最基本的索引类型,没有唯一性之类的限制,目的只是加快数据的访问速度
mysql> CREATE TABLE STUDENT(
-> ID INT PRIMARY KEY AUTO_INCREMENT,
-> NAME CHAR(40) NOT NULL,
-> AGE INT NOT NULL,
-> GRADE DOUBLE,
-> INDEX (ID)
-> );
Query OK, 0 rows affected (0.10 sec)
mysql> SHOW CREATE TABLE STUDENT \G
*************************** 1. row ***************************
Table: STUDENT
Create Table: CREATE TABLE `student` (
`ID` int(11) NOT NULL auto_increment,
`NAME` char(40) NOT NULL,
`AGE` int(11) NOT NULL,
`GRADE` double default NULL,
PRIMARY KEY (`ID`),
KEY `ID` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
已成功创建索引,使用explain查看索引是否正在使用
mysql> EXPLAIN SELECT * FROM STUDENT WHERE ID=1 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: STUDENT
type: const
possible_keys: PRIMARY,ID
key: PRIMARY
key_len: 4
ref: const
rows: 1
Extra:
1 row in set (2.13 sec)
2.创建唯一索引
mysql> CREATE TABLE STUDENT(
-> ID INT PRIMARY KEY AUTO_INCREMENT,
-> NAME CHAR(40) NOT NULL,
-> AGE INT NOT NULL,
-> GRADE DOUBLE,
-> UNIQUE INDEX UNI_INDEX (ID)
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> SHOW CREATE TABLE STUDENT \G
*************************** 1. row ***************************
Table: STUDENT
Create Table: CREATE TABLE `student` (
`ID` int(11) NOT NULL auto_increment,
`NAME` char(40) NOT NULL,
`AGE` int(11) NOT NULL,
`GRADE` double default NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `UNI_INDEX` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
3.创建单列索引
单列索引是在数据表中的某一个字段创建的索引,可创建多个单列索引
mysql> drop table student;
Query OK, 0 rows affected (1.81 sec)
mysql> CREATE TABLE STUDENT(
-> ID INT PRIMARY KEY AUTO_INCREMENT,
-> NAME CHAR(40) NOT NULL,
-> AGE INT NOT NULL,
-> GRADE DOUBLE,
-> INDEX SINGLE_INDEX(NAME(30))
-> );
Query OK, 0 rows affected (0.10 sec)
mysql> SHOW CREATE TABLE STUDENT \G
*************************** 1. row ***************************
Table: STUDENT
Create Table: CREATE TABLE `student` (
`ID` int(11) NOT NULL auto_increment,
`NAME` char(40) NOT NULL,
`AGE` int(11) NOT NULL,
`GRADE` double default NULL,
PRIMARY KEY (`ID`),
KEY `SINGLE_INDEX` (`NAME`(30))
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
4.创建组合索引
mysql> CREATE TABLE STUDENT(
-> ID INT PRIMARY KEY AUTO_INCREMENT,
-> NAME CHAR(40) NOT NULL,
-> AGE INT NOT NULL,
-> GRADE DOUBLE,
-> INDEX MULT_INDEX(ID,NAME,GRADE)
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> SHOW CREATE TABLE STUDENT \G
*************************** 1. row ***************************
Table: STUDENT
Create Table: CREATE TABLE `student` (
`ID` int(11) NOT NULL auto_increment,
`NAME` char(40) NOT NULL,
`AGE` int(11) NOT NULL,
`GRADE` double default NULL,
PRIMARY KEY (`ID`),
KEY `MULT_INDEX` (`ID`,`NAME`,`GRADE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
5.创建全文索引
只为char,varchar和text列创建索引
mysql> CREATE TABLE STUDENT(
-> ID INT PRIMARY KEY AUTO_INCREMENT,
-> NAME CHAR(40) NOT NULL,
-> AGE INT NOT NULL,
-> GRADE DOUBLE,
-> FULLTEXT INDEX FULL(NAME)
-> )ENGINE=MyISAM;
Query OK, 0 rows affected (2.14 sec)
mysql> SHOW CREATE TABLE STUDENT \G
*************************** 1. row ***************************
Table: STUDENT
Create Table: CREATE TABLE `student` (
`ID` int(11) NOT NULL auto_increment,
`NAME` char(40) NOT NULL,
`AGE` int(11) NOT NULL,
`GRADE` double default NULL,
PRIMARY KEY (`ID`),
FULLTEXT KEY `FULL` (`NAME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (2.08 sec)
6.在已经存在的表上创建索引
使用alter table创建
ALTER TABLE STUDENT ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [INDEX_NAME](COL_NAME[LENGTH],...) [ASC|DESC]
使用create index创建
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX INDEX_NAME ON TABLE_NAME (COL_NAME[LENGTH,...]) [ASC|DESC]
删除索引
1.使用alter table删除
alter table table_name drop index index_name;
注:添加AUTO_INCREMENT约束字段的唯一索引不能删除
2.使用drop index语句删除
DROP INDEX INDEX_NAME ON TABLE_NAME;