?? 个人主页:黄小黄的博客主页
支持我:?? 点赞 ?? 收藏 ??关注
?? 格言:一步一个脚印才能承接所谓的幸运本文来自专栏:MySQL8.0学习笔记
本文参考视频:MySQL数据库全套教程
欢迎点击支持订阅专栏
hello,大家好,我是黄小黄同学。本篇给大家带来的是数据库中索引的分类与操作相关内容。你将学习到单列索引、组合索引、全文索引以及空间索引。关于索引的内部原理比如Hash与B+Tree将放到下篇进行讲解,欢迎关注。
?? 何为索引?
索引是通过某种算法,构建出一个数据模型,用于快速找出在某列中具有特定值的行。 如果不使用索引,MySQL则会从第一条记录开始读完整个表,从而找出相关的行。
表越大,需要查询花费的时间就越多。如果表中查询的列有一个索引,MySQL能够快速到达这个位置去搜索数据文件,而不必查看所有数据,可以很大程度减少时间。
索引类似于目录,通过页码找到对应的内容。
举一个形象的例子,兔子和乌龟挑选箱子,只有一个箱子有宝物,其余都是空箱子。而有宝物的箱子被胡萝卜标记,兔子更倾向于有胡萝卜的箱子,而乌龟则需要一个个尝试,掂量,才能知道哪个箱子藏着宝物。

1.按照数据结构分:

2.按照索引功能分:
单列索引是指一个索引只包含单个列,但是一个表中可以有多个单列索引。
MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,仅仅是为了让查询数据更加快速。
在下面的例子中,我们给name列添加了普通索引 index_name,使用的方式为 在创建表的时候直接指定, 相关代码如下:
CREATE DATABASE forindextest;
USE forindextest;
-- 在创建表的时候直接指定index
CREATE TABLE student
(
sid INT PRIMARY KEY,
card_id VARCHAR(20),
name VARCHAR(20),
gender VARCHAR(20),
age INT,
birth DATE,
phone_num VARCHAR(20),
score DOUBLE,
INDEX index_name (name) -- 给name列创建索引
);
除了创建表时添加索引外,也可以 直接创建:
以给student表中的gender列添加索引为例
CREATE INDEX index_gender ON student(gender);
同样可以使用修改表的形式添加索引:
ALTER TABLE student ADD INDEX index_age(age);
如果想要查看该表的索引的话,可以使用下面的语句:
SHOW INDEXES FROM student;

唯一索引的 索引列必须唯一,但是允许有空值。 如果是组合索引,则列值的组合必须唯一。
比如在上面的例子中,我们可以给card_id(身份证号)与phone_num(手机号码)添加唯一索引。创建唯一索引同样有三种方式,具体如下:
方式1 创建表的时候直接指定:
给card_id列创建唯一索引
CREATE TABLE student
(
sid INT PRIMARY KEY,
card_id VARCHAR(20),
name VARCHAR(20),
gender VARCHAR(20),
age INT,
birth DATE,
phone_num VARCHAR(20),
score DOUBLE,
UNIQUE index_card_id(card_id);
);
方式2 直接创建:
给card_id列创建唯一索引
CREATE UNIQUE INDEX index_card_id ON student(card_id);
方式3 修改表结构的方式添加索引:
给phone_num列添加唯一索引
ALTER TABLE student ADD UNIQUE index_phone_num(phone_num);
每张表一般都会有一个主键,在我们创建表时,MySQL会自动在主键列上建立一个索引,我们称之为主键索引。主键具有唯一性并且不能为NULL, 所有主键索引是一种特殊的唯一索引。
删除索引的语法格式如下:
-- 1 方式一
drop index 索引名 on 表名;
-- 2 方式二
alter table 表名 drop index 索引名;
?? 何为组合索引?
?? 语法格式:
-- 创建组合索引
create index index_name on table_name(column1(length), column2(length));
举个例子,假设我们通过如下的语句给手机号和姓名两列添加了复合唯一索引:
create unique index index_phone_name on student(phone_num, name);
在查询的时候,如果查询为姓名,则使用不到刚刚创建的索引,因为在创建组合索引时先创建的是phone_num的, 具体操作示例如下:
select * from student where name = 'xxx';
select * from student where phone_name = 'xxxxxx';
select * from student where phone_num = 'xxx' and name = 'xxx';
select * from student where name = 'xxx' and phone_num = 'xxx';
在上面的代码中,只有2、3、4的情况可以使用到索引index_phone_name,因为条件里必须包含索引前面的字段才能进行匹配;
而3和4相比where条件的顺序不一样,但是4却也可以使用到索引。因为mysql本身进行了一层sql优化,它会根据sql识别出来使用哪个索引,我们可以认为3和4在mysql看来是等价的。
?? 何为全文索引?
使用like+%就可以实现模糊匹配了,为什么还要使用全局索引呢?
like+%在文本比较少的时候是比较合适的,但是对于大量的文本数据检索是不可想象的。全文索引在大量的数据面前,会更加快速。但是也有缺点,比如有可能存在精度问题。
补充:
想对一个词语使用全局索引搜索,这个词语的长度必须在最小搜索长度和最大搜索长度之间, 查看默认值的语句如下:
show variables like '%ft%';
1.数据准备: 使用下面的语句进行数据准备,创建表和全文索引并插入一定量的数据,数据如图所示:
CREATE TABLE article
(
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255),
content VARCHAR(1000),
writing_date DATE,
--FULLTEXT (content) -- 创建全文索引
);
-- 插入数据
INSERT INTO article
VALUES (NULL, 'Dog and cat', 'I like dog, but you like cat.', '2022-07-07');
INSERT INTO article
VALUES (NULL, 'Who are you?', 'I am human.', '2022-07-07');
-- 添加全文索引
CREATE FULLTEXT INDEX index_content ON article(content);

2.使用全文索引:
语法格式如下:
match(col1, col2...) against(expr[search_modifier]);
操作示例如下:
SELECT * FROM article WHERE MATCH(content) AGAINST('Do'); -- 没有结果 长度小于3
SELECT * FROM article WHERE MATCH(content) AGAINST('Dog');

?? 简介:
操作:
create table shop_info(
id primary key auto_increment comment 'id',
shop_name varchar(64) not null comment '门店名称',
geom_point geometry not null comment '经纬度',
spatial key geom_index(geom_point)
);
??以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 !
如果有问题,欢迎私信或者评论区!

共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦