如何成为SQL高手第三关:索引及维护

Posted IT邦德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何成为SQL高手第三关:索引及维护相关的知识,希望对你有一定的参考价值。

👨‍🎓 博主介绍:
IT邦德,江湖人称jeames007,10年DBA工作经验
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程

SQL对于现在的互联网公司产研岗位几乎是一个必备技能,但仅会SQL的话,应该是什么都做不了。
1.如果你是数据分析师,你需要熟练地把自己脑子里的数据和指标需求翻译成SQL逻辑去查询数据,进而完成自己的数据分析报告等,你的产出是分析报告,而不是SQL代码;
2.如果你是数仓工程师(偏应用层),你需要根据业务逻辑去设计模型,编写调度任务去产出数据,以供业务人员使用,你的产出是数据模型和表;
3.如果你是算法工程师,你可能需要用SQL来实现用户标签、特征工程等工作,但是这些是为你的模型训练评估做基础准备工作,你的产出是可以提升某些指标的算法模型。

所以,SQL每个人都要用,但是用来衡量产出的并不是SQL本身,你需要用这个工具,去创造其它的价值。
IT邦德老师带你成为SQL高手,那我们开始吧~

文章目录

1.索引的创建

1.1. 普通索引

按照下图的表结构创建tb_student1表,要求在创建的同时在studentName字段上建立普通索引,
索引名为idx_studentName

create table if not exists tb_student1 (
studentNo CHAR(10) not NULL primary key comment '学号',
studentName VARCHAR(10) NOT null comment '姓名',
sex CHAR(2) comment '性别',
birthday date comment '出生日期',
native VARCHAR(20) comment '籍贯',
nation VARCHAR(10) DEFAULT '汉' comment '民族',
classNo CHAR(6) comment '所属班级',
INDEX idx_studentName(studentName)
) ENGINE=InnoDB comment '学生表';

注:INDEX idx_studentName(studentName)这个是关键
此方法是创建新表的同时创建普通索引

1.2. 唯一索引

按照下图的表结构创建tb_class1表,要求在创建的同时在className字段上建立唯一索引,
索引名为uqidx_className

CREATE TABLE tb_class1 (
 classNo CHAR(6) PRIMARY KEY NOT NULL,
 className VARCHAR(20) NOT NULL,
 department VARCHAR(20),
 grade ENUM('1','2','3','4'), 
 classNum TINYINT,
 constraint uq_class unique(className),
 UNIQUE INDEX uqidx_className(className)
) engine=InnoDB default charset=gb2312;

注: UNIQUE INDEX uqidx_className(className)是关键
此方法是创建新表时创建唯一索引

1.3. 主键索引

按照如下的表结构创建tb_course1,要求创建的同时在courseNo字段上建立主键索引

CREATE TABLE tb_course1 (
 courseNo CHAR(6) primary key comment '课程号',
 courseName VARCHAR(20) unique not NULL comment '课程名',
 credit DECIMAL(3,1) not NULL comment '学分',
 courseHour TINYINT(2) not NULL comment '课时数', 
 term TINYINT(2) comment '开课学期',
 priorCourse CHAR(6) comment '先修课程'
) engine=InnoDB default charset=gb2312;

注: courseNo CHAR(6) primary key comment '课程号' 是关键
次方法是在创建新表的同时创建主键索引

1.4. 升序降序索引

按照如下表结构创建tb_score1,
要求使用create index 语句对studentNo建立普通降序索引,索引名为idx_studentNo,
对courseNo建立普通升序索引,索引名为idx_courseNo.

CREATE TABLE tb_score1(
 studentNo CHAR(10) NOT NULL comment '学号',
 courseNo CHAR(6) NOT NULL comment '课程号',
 credit DECIMAL(4,1) not NULL comment '成绩'
) engine=InnoDB default charset=gb2312;

alter table tb_score1 add index idx_studentNo(studentNo desc);
alter table tb_score1 add index idx_courseNo(courseNo);

使用create index语句创建基于字段值前缀字符的索引
在tb_course上建立一个索引,要求按课程名称courseName字段值的前三个字符建立降序索引。
–函数要再加个括号
alter table tb_course add index idx_courseName1((left(courseName,3)) desc);
DROP INDEX idx_courseName1 on tb_course;

使用alter table语句建立普通索引:在tb_score上建立普通索引
要求使用alter table语句对courseNo字段建立普通索引,索引名为idx_courseNo.
alter table tb_score add index idx_courseNo(courseNo);

2.索引的维护

2.1 查看索引

使用show index from tb_student1 \\G;
查看tb_student表的索引,显示内容中主要参数说明:
Table: 指明索引所在表的名字。
Non_unique: 该索引是不是唯一索引,如果是唯一索引,该值为0;如果不是唯一索引,该值为1.
Key_name: 索引的名字。如果在创建索引语句里使用了primary key关键字,且没有明确给出索引名,则系统会为其指定一个索引名PRIMARY。
Column_name: 建立索引的列名称.
Collation: A表示升序;NULL表示没有排序。

2.2 删除普通索引

删除tb_student1表中idx_studentName索引
DROP INDEX idx_studentName on tb_student1;

2.3 删除主键索引

删除在表tb_student中定义的主键约束
Alter table tb_student drop primary key;
添加主键约束,用alter table语句在tb_student对studentNo重新添加主键。
Alter table tb_student add primary key(studentNo);

3.技能拓展

3.1 索引介绍

基于InnoDB,数据结构都是B+树,特点是:
主键索引存储的是mysql整个数据行
普通索引存储的是索引列和主键的值

Mysql 8.0.13版本及以上已经出现了函数索引

3.2 索引的创建原则

a.出现Where子句中的列(比较频繁)
b.索引的基数越大的越好(唯一值)
c.短索引(列的长度)
d.排序 order by 、分组 group by (适合建索引)
e.数据量少的做索引

大家点赞、收藏、关注、评论啦 👇🏻👇🏻👇🏻微信公众号👇🏻👇🏻👇🏻

以上是关于如何成为SQL高手第三关:索引及维护的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 索引 - 升序或降序,有啥区别?

疑问? Oracle普通的B树索引是升序还是降序?

你可能不知道SQL Server索引列的升序和降序带来的性能问题

几道sql题求答案

sql几道题希望回答一下

python:argsort,将数组升序或降序,将矩阵每一行升序或降序,返回其索引