Mysql 索引增长与删除

【1】索引 sql

索引,通俗理解,即目录。数据库

以前说过,计算机是对现实世界的模拟。目录应用在数据库领域,即所谓的索引。ui

目录的做用显而易见,因此创建索引能够大大提升检索的速度。spa

可是,会下降更新表的速度,如对表进行INSERT、UPDATE和DELETE。3d

因更新表时,MySQL不只要保存数据,还要保存一下索引文件。code

创建索引会占用磁盘空间的索引文件。 blog

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。 索引

【2】索引分类ip

Mysql的索引分为普通索引、惟一索引、主键、全文索引。字符串

有的地方分为单列索引(普通索引、惟一索引、主键索引)和组合索引、全文索引。我的认为太学术性。

(2.1)主键(PRIMARY KEY)

场景1:使用AUTO_INCREMENT

# 场景1:
# 建立表SQL特色
# 1.sId列被AUTO_INCREMENT修饰
# 2.没有任何索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
  `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

SQL执行失败。

提示ERROR:

Incorrect table definition; there can be only one auto column and it must be defined as a key

分析缘由:没有为sId列建立索引,即key

场景2:建立表同时建立主键

# 场景2:
# 建立表SQL特色
# 1.sId列被AUTO_INCREMENT修饰
# 2.建立主键
# 3.主键列为sId
DROP TABLE IF EXISTS students2;
CREATE TABLE `students2` (
  `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`sId`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb

SQL执行成功。

查询主键:

# 查询表索引
SHOW INDEX FROM students2;

结果:

说明:场景2为建立主键的方式之一。

场景3:建立表不添加任何索引

# 场景3:
# 建立表SQL特色
# 1.sId列没有被AUTO_INCREMENT修饰
# 2.没有任何索引
DROP TABLE IF EXISTS students3;
CREATE TABLE `students3` (
  `sId` INT(20) UNSIGNED NOT NULL,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

执行成功。

建立主键(单列):

# 建立主键(单列)
ALTER TABLE students3 ADD PRIMARY KEY (sId);

查询主键:

# 查询主键
SHOW INDEX FROM students3;

查询结果:

删除主键:

# 删除主键
ALTER TABLE students3 DROP PRIMARY KEY;

建立主键(多列):

# 建立主键(多列)
ALTER TABLE students3 ADD PRIMARY KEY (sId, sName);

查询主键:

# 查询主键
SHOW INDEX FROM students3;

查询结果:

删除主键,方法同上。

若不删除这个多列主键,试图再添加一个主键:

# 建立第二个主键索引
ALTER TABLE students3 ADD PRIMARY KEY (sId, sStuId);

执行报错:

查询:ALTER TABLE students3 ADD PRIMARY KEY (sId, sStuId) 错误代码: 1068
Multiple PRIMARY KEY defined

多个主键定义错误!

分析以上三种场景,对主键总结:

(a)主键列的值必须是惟一的

(b)主键列的值不容许为空

(c)主键保证记录的惟一性

(d)主键能够由多列组成

(e)每张表只容许存在一个主键

(2.2)惟一索引

场景1:建立表时建立惟一索引

# 场景1:建表时建立惟一性索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
  `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`sId`),
  UNIQUE INDEX `idx_name` (`sName`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

# 查询表索引
SHOW INDEX FROM students1;

查询惟一索引结果:

提示:此为建立惟一索引方式之一

场景2:建立表时未建立惟一索引

若是建立表时,忘记建立惟一索引,那么能够经过两种方式添加:

建立惟一索引方式二

# 建立惟一索引(单列)
CREATE UNIQUE INDEX uidx_name ON students2 (sName);
# 查询惟一索引(单列)
SHOW INDEX FROM students2;
# 删除惟一索引(单列)
DROP INDEX uidx_name ON students2;
# 查询惟一索引(单列)
SHOW INDEX FROM students2;

查询惟一索引结果:

建立惟一索引方式三

# 建立惟一索引(单列)
ALTER TABLE students2 ADD UNIQUE INDEX uidx_name (sName);
# 查询惟一索引(单列)
SHOW INDEX FROM students2;
# 删除惟一索引(单列)
ALTER TABLE students2 DROP INDEX uidx_name;
# 查询惟一索引(单列)
SHOW INDEX FROM students2;

查询惟一索引结果:

建立多列惟一索引

# 建立惟一索引(多列)
ALTER TABLE students2 ADD UNIQUE INDEX uidx_addr_age (sAddr, sAge);
# 查询惟一索引(多列)
SHOW INDEX FROM students2;
# 删除惟一索引(多列)
ALTER TABLE students2 DROP INDEX uidx_addr_age;
# 查询惟一索引(多列)
SHOW INDEX FROM students2;

查询多列惟一索引结果:

建立多个惟一索引:

# 建立惟一索引(单列)
CREATE UNIQUE INDEX uidx_name ON students2 (sName);
# 建立惟一索引(多列)
ALTER TABLE students2 ADD UNIQUE INDEX uidx_addr_age (sAddr, sAge);
# 查询惟一索引
SHOW INDEX FROM students2;
# 删除索引uidx_name
DROP INDEX uidx_name ON students2;
# 删除索引uidx_addr_age
DROP INDEX uidx_addr_age ON students2;

查询惟一索引结果(uidx_name 和 uidx_addr_age两个惟一索引):

分析以上两种场景,对惟一索引总结

(a)惟一索引的目的不是为了提升访问速度,而只是为了不数据出现重复。

(b)索引列的值必须惟一,但容许有NULL。若是惟一索引是组合列索引,则组合列的值必须惟一。

(c)每张表能够建立多个惟一索引。

(2.3)普通索引

场景1:建立表时建立普通索引

# 场景1:建立表时建立普通索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
  `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`sId`),
  INDEX `idx_name` (`sName`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

# 查询普通索引
SHOW INDEX FROM students1;

查询建立索引:

场景2:建立表时未建立普通索引

# 场景2:建立表时未建立普通索引
DROP TABLE IF EXISTS students2;
CREATE TABLE `students2` (
  `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`sId`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

若建立表时未建立普通索引,能够经过如下两种方式建立普通索引:

建立普通索引方式二

# 建立普通索引(单列)
CREATE INDEX idx_name ON students2 (sName);
# 查询普通索引(单列)
SHOW INDEX FROM students2;
# 删除普通索引(单列)
DROP INDEX idx_name ON students2;
# 查询普通索引(单列)
SHOW INDEX FROM students2;

查询建立索引:

建立普通索引方式三

# 建立普通索引(单列)
ALTER TABLE students2 ADD INDEX idx_addr (sAddr);
# 查询普通索引(单列)
SHOW INDEX FROM students2;
# 删除普通索引(单列)
ALTER TABLE students2 DROP INDEX idx_addr;
# 查询普通索引(单列)
SHOW INDEX FROM students2;

查询建立索引:

建立普通多列索引

# 建立普通索引(多列)
ALTER TABLE students2 ADD INDEX idx_addr_age (sAddr, sAge);
# 查询普通索引(多列)
SHOW INDEX FROM students2;
# 删除普通索引(多列)
ALTER TABLE students2 DROP INDEX idx_addr_age;
# 查询普通索引(多列)
SHOW INDEX FROM students2;

查询建立索引:

建立多个普通索引

# 建立多个普通索引
# 建立普通索引(单列)
CREATE INDEX idx_name ON students2 (sName);
# 建立普通索引(多列)
ALTER TABLE students2 ADD INDEX idx_addr_age (sAddr, sAge);
# 查询普通索引
SHOW INDEX FROM students2;
# 删除索引idx_name
DROP INDEX idx_name ON students2;
# 删除索引idx_addr_age
DROP INDEX idx_addr_age ON students2;
# 查询普通索引
SHOW INDEX FROM students2;

查询建立索引:

分析以上两种场景,对普通索引(最基本的索引,没有任何限制)总结

(a)索引列的值能够为NULL,能够重复。

(b)每张表能够建立多个普通索引。

(c)普通索引一样也能够建立多列。

(2.4)全文索引

场景1:建立表时建立全文索引

# 场景1:建立表时建立全文索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
  `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`sId`),
  FULLTEXT ft_name_stuid (sName, sStuId) 
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

# 查询表索引
SHOW INDEX FROM students1;

查询索引结果:

场景2:建立表时未建立全文索引

# 场景2:建立表时未建立全文索引
DROP TABLE IF EXISTS students1;
CREATE TABLE `students1` (
  `sId` INT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `sName` VARCHAR(100) NOT NULL,
  `sAge` INT(10) NOT NULL,
  `sAddr` VARCHAR(200) DEFAULT NULL,
  `sGrade` INT(10) DEFAULT NULL,
  `sStuId` VARCHAR(20) DEFAULT NULL,
  `sSex` INT(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`sId`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

# 查询表索引
SHOW INDEX FROM students1;

若建立表时未建立索引,能够经过如下两种方式建立:

建立全文索引方式二

# 建立全文索引方式二:
# 建立全文索引(多列)
CREATE FULLTEXT INDEX ft_name_addr ON students2 (sName, sAddr);
# 查询全文索引(多列)
SHOW INDEX FROM students2;
# 删除全文索引(多列)
DROP INDEX ft_name_addr ON students2;
# 查询全文索引(多列)
SHOW INDEX FROM students2;

查询全文索引:

建立全文索引方式三

# 建立全文索引方式三:
# 建立全文索引(多列)
ALTER TABLE students2 ADD FULLTEXT INDEX ft_name_stuid (sName, sStuId);
# 查询全文索引(多列)
SHOW INDEX FROM students2;
# 删除全文索引(多列)
ALTER TABLE students2 DROP INDEX ft_name_stuid;
# 查询全文索引(多列)
SHOW INDEX FROM students2;

查询全文索引:

建立多个全文索引:

# 建立多个全文索引
# 建立全文索引(单列)
CREATE FULLTEXT INDEX ft_name_stuid ON students2 (sName, sStuId);
# 建立全文索引(多列)
ALTER TABLE students2 ADD FULLTEXT INDEX ft_addr (sAddr);
# 查询全文索引
SHOW INDEX FROM students2;
# 删除索引ft_name_stuid
DROP INDEX ft_name_stuid ON students2;
# 删除索引ft_addr
DROP INDEX ft_addr ON students2;
# 查询索引
SHOW INDEX FROM students2;

查询全文索引:

添加整型字段的全文索引:

ALTER TABLE students2 ADD FULLTEXT INDEX ft_age (sAge);

执行失败:

查询:ALTER TABLE students2 ADD FULLTEXT INDEX ft_age (sAge)错误代码: 1283

COLUMN 'sAge' cannot be part of FULLTEXT INDEX

说明:全文索引只可针对字符串类型的字段。

分析以上两种场景,对全文索引总结

(a)全文索引只针对字段类型为字符串的列。

(b)全文索引能够为多列建立。

【3】总结

(3.1)增长索引:

// 普通索引
alter table table_name add index index_name (column_list);
// 惟一索引
alter table table_name add unique index uindex_name (column_list);
// 主键索引
alter table table_name add primary key (column_list);
// 全文索引
alter table table_name add fulltext index ftindex_name (column_list);

// 普通索引
create index index_name on table_name (column_list);
// 惟一索引
create unique index index_name on table_name (column_list);
// 全文索引
create fulltext index ftindex_name on table_name (column_list);

(3.2)删除索引:

// 非主键索引
drop index index_name on table_name;
alter table table_name drop index index_name;
// 删除主键
alter table table_name drop primary key;

 

Good Good Study, Day Day Up.

顺序 选择  循环 总结

相关文章
相关标签/搜索