索引与数据库完整性
- 第1关:索引
- 任务描述
- 相关知识
- 索引是什么
- 索引的分类
- 索引的创建和删除
- 查询表中索引
- 编程要求
- 参考代码
- 第2关:删除索引-练习
- 任务描述
- 相关知识
- 编程要求
- 测试说明
- 参考代码
第1关:索引
任务描述
本关任务:为 student 表按姓名升序建立索引,索引名为 idx_sname。
相关知识
为了完成本关任务,你需要掌握:
-
索引是什么;
-
索引的分类;
-
索引的创建和删除;
-
查询索引。
索引是什么
数据库索引是一种提高数据库系统性能的方法。索引能让数据库服务器更快地查找和获取表中指定的行。
例如,为了方便读者快速查找书中的术语,很多书籍在最后附加了索引页,术语按字母排序,同时给出页码。这样读者可以根据术语名,快速获取页码,而不用翻阅整本书。
但是索引也给数据库系统带来了一定的开销,所以我们应该谨慎地使用它们。
例如现在有一张简单的表:
create table test
(
id int not null,
content varchar(255) not null
)
在这张表中假设存了1000
条数据(id
依次递增且不重复),我们要查询表中id=234
的数据,sql
如下:
select * from test where id = 234;
一般情况,在没有索引下,数据库系统必须扫描整个表(一行一行地检查),才能获取到所有满足条件的行,很明显这种方法的效率是非常低的。
那么肯定有优化的方法,就是 索引 了!在id
字段上添加索引,这样 MySQL
就只需要扫描一行数据就可以了。
索引的分类
索引大体可分为单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引四类。本实训我们主要介绍单例索引和组合索引:
-
单例索引:一个索引只包含单个列,但一个表中可以有多个单列索引;
- 普通索引:仅加速查询 最基本的索引,没有任何限制,是我们大多数情况下使用到的索引;
- 唯一索引:索引列中的值必须是唯一的,但允许为空值;
- 主键索引:是一种特殊的唯一索引,不允许有空值。
-
组合索引:在表的多个字段上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。
索引的创建和删除
创建索引
创建索引有两种方式,一种是在建表时创建,另一种是建表后创建:
- 普通索引:
- 创表时创建普通索引:
CREATE table mytable( id INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username) );
- 建表后创建普通索引:
asc 代表升序索引,desc 代表降序,mysql 默认升序索引。create INDEX 索引名称 on 表名(字段名 desc/asc); #或者 ALTER TABLE 表名 ADD INDEX 索引名称 (字段名);
- 唯一索引:
CREATE UNIQUE INDEX 索引名称 ON 表名(字段名); #或者 ALTER TABLE 表名 ADD UNIQUE (字段名);
- 主键索引:主键索引一般在建表时创建,会设为
int
而且是AUTO_INCREMENT
自增类型的,例如一般表的id
字段。CREATE TABLE mytable ( id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) );
- 组合索引:组合索引就是在多个字段上创建一个索引。(应用场景:当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度)
CREATE INDEX 索引名称 ON 表名(字段1,字段2,字段3); #或者 ALTER TABLE 表名 ADD INDEX 索引名称(字段1,字段2,字段3);
删除索引
同样,删除索引也有两种方式。
#使用drop删除索引
drop index index_name on table_name ;
#使用alter删除索引
alter table table_name drop index index_name ;
alter table table_name drop primary key ; #删除主键索引
查询表中索引
查询索引 SQL
:
show index from 表名;
如下图:
查询结果部分字段解释:
字段名 | 说明 |
---|---|
Table | 创建索引的表 |
Non_unique | 表示索引非唯一,1 代表非唯一索引,0 代表唯一索引,意思就是该索引是不是唯一索引 |
Key_name | 索引名称 |
Seq_in_index | 表示该字段在索引中的位置,单列索引的话该值为1 ,组合索引为每个字段在索引定义中的顺序(只需要知道单列索引该值就为1 ,组合索引为别的) |
Column_name | 表示定义索引的列字段 |
Sub_part | 表示索引的长度 |
Null | 表示该字段是否能为空值 |
Index_type | 表示索引类型 |
编程要求
在右侧编辑器补充代码,要求如下:
为 student
表按姓名升序建立索引,索引名为 idx_sname
。
测试说明
平台会对你编写的代码进行测试,将你所创建的索引都现实出来,具体现实效果请查看右侧测试集。
开始你的任务吧,祝你成功!
参考代码
use teachingdb;
/****请在此编写代码,操作完毕之后点击评测******/
/**********Begin**********/
create index idx_sname on student(sname asc);
/**********End**********/
第2关:删除索引-练习
任务描述
本关任务:删除索引 idx_sname。
相关知识
见上一关
编程要求
根据提示,在右侧编辑器补充代码,删除索引 idx_sname。
测试说明
编写代码后,点击测评即可。
开始你的任务吧,祝你成功!
参考代码
use teachingdb;
/****请在此编写代码,操作完毕之后点击评测******/
/**********Begin**********/
drop index idx_sname on student;
/**********End**********/