数据库习题之索引

255 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情
更新数据库习题
和前一篇文章(mysql数据库习题2 - 掘金 (juejin.cn))表一样的

索引

  1. 在学生作业管理数据库中查询某位老师所讲授的课程信息,因此可以在课程表上创建一个关于授课老师cteacher的一个非聚集索引 id_teacher来优化查询速度

  2. 查询学生作业管理数据库中课程表的索引信息

  3. 删除学生作业管理数据库中课程表的cteacher上的索引

看到这几个问题,大家会吗?
首先,我们需要了解,什么是索引

1.索引是什么?

比如拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

  • 索引是帮助MySQL高效获取数据的数据结构。
  • 索引往往存储在磁盘上的文件中
  • 索引中包括:聚集索引,覆盖索引,组合索引,前缀索引,唯一索引等,默认都是使用B+树结构组织索引 简单来说:索引就是一种数据结构。
    image.png 那么这么几种索引,有啥区别啊?

区别

聚集索引(InnoDB)

主键索引(聚集索引)的叶子结点会存储数据行,也就是说数据和索引在一起 辅助索引只会存储主键值

非聚集索引(MyISAM)

B+树叶子结点只会存储数据行(数据文件)的指针,简单来说就是数据和索引不在一起 非聚集索引包含 主键索引 和 辅助索引 到会存储指针的值

主键索引Primary key

InnoDB要求表必须有主键(MyISAM可以没有),如果没有,MySQL系统会自动选择一个唯一标识数据记录的列作为主键

MyISAM的索引文件(mdi)仅仅保存数据记录的地址

MyISAM的数据文件(ibd)中记录对应的记录

辅助索引Secondary key(次要索引)

结构和主键搜索引没有任何区别 同样用B+Tree,data域存储相应记录主键的值而不是地址

看完是不是还是一脸懵
简单来说

主键索引,每个数据表只能有1个主键索引列。主键索引的列,不允许出现重复的数据,也不允许为空值。最快。

聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据

其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。

两个区别

区别一:

聚集索引:就是以主键创建的索引,在叶子节点存储的是表中的数据

非聚集索引:就是以非主键创建的索引(也叫做二级索引),在叶子节点存储的是主键和索引列。

区别二:

聚集索引中表记录的排列顺序和索引的排列顺序一致;所以查询效率快,因为只要找到第一个索引值记录,其余的连续性的记录在物理表中也会连续存放,一起就可以查询到。缺点:新增比较慢,因为为了保证表中记录的物理顺序和索引顺序一致,在记录插入的时候,会对数据页重新排序。\

非聚集索引中表记录的排列顺序和索引的排列顺序不一致。

区别三:

聚集索引是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储不连续。

区别四:

聚集索引每张表只能有一个,非聚集索引可以有多个。 辅助索引:在索引和表之间多了一个存储地址的表。通过中间表,把两个连起来

这么创建索引?

1

CREATE INDEX indexName ON table_name (column_name)

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构(添加索引)

ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接指定

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
INDEX [indexName] (username(length))  
 
);  

删除索引的语法

DROP INDEX [indexName] ON mytable; 

创建唯一索引

CREATE UNIQUE INDEX indexName ON mytable(username(length)) 

创建聚集索引

create CLUSTERED INDEX 索引名称 ON 表名(字段名)

创建非聚集索引

create NONCLUSTERED INDEX 索引名称 ON 表名(字段名)

展示索引

SHOW INDEX FROM <表名> [ FROM <数据库名>]

答案

-- 1.	在学生作业管理数据库中查询某位老师所讲授的课程信息,因此可以在课程表上创建一个关于授课老师cteacher的一个非聚集索引 id_teacher来优化查询速度
-- 聚集 nun变成CLUSTERED
create nonclustered INDEX cteacher ON course(cNo);
-- 2.	查询学生作业管理数据库中课程表的索引信息
SHOW index from course;
-- 3. 删除学生作业管理数据库中课程表的cteacher上的索引
drop index cteacher on course ;