MySQL学习笔记.索引的操作

索引简介

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录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;

猜你喜欢

转载自blog.csdn.net/qq_44862120/article/details/109174183