当前位置:网站首页>索引的创建、查看、删除
索引的创建、查看、删除
2022-08-11 02:57:00 【pmc0_0】
文章目录
1. 索引分类
- 从
功能逻辑
上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。 - 按照
物理实现方式
,索引可以分为 2 种:聚簇索引和非聚簇索引。 - 按照
作用字段个数
进行划分,分成单列索引和联合索引。
- 普通索引
在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,
在表student的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询
。
- 唯一性索引
使用UNIQUE参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引作用的列值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。例如,
在表student的字段email中创建唯一性索引,那么字段email的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录
。
- 主键索刭
主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也就是NOT NULL+UNIQUE,张表里最多只有一个主键索引。这是由主键索引的物理实现方式决定的,因为数据存储在文件中只能按照一种顺序进行存储。InnoDB主键索引就是聚簇索引
- 单列索引
在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。一个表可以有多个单列索引。
- 多列(组合、联合)索引
多列索引是在表的多个字段组合上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段中的第一个字段时才会被使用。例如,
在表中的字段id、name和gender上建立一个多列索引idx_id_name_gender,只有在查询条件中使用了字段id时该索引才会被使用。使用组合索引时遵循最左前缀集合。
- 全文索引
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。
使用参数FULLTEXT可以设置索引为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引只能创建在CHAR、VARCHAR 或TEXT类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。例如,表student的字段information是TEXT类型该字段包含了很多文字信息。在字段information上建立全文索引后,可以提高查询字段information的速度。全文索引典型的有两种类型:自然语言的全文索引和布尔全文索引。
自然语言搜索引擎将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过50%的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。
索引常用命令
# 查看该表索引
SHOW INDEX FROM student
2. 索引创建
# [UNIQUE | FULLTEXT | SPATIAL]为指定创建索引类型
# [INDEX | KEY]为创建索引关键字,两个都可以
# 列名 [length],varchar类型的属性,可以指定索引作用的长度,比如只作用在前20个字符
CREATE TABLE 表名([col_name data_type]
[UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [索引名] (列名 [length]) [ASC | DESC]
);
UNIQUE
、FULLTEXT
和SPATIAL
为可选参数,分别表示唯一索引、全文索引和空间索引;INDEX
与KEY
为同义词,两者的作用相同,用来指定创建索引;index_name
指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;col_name
为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;length
为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;ASC
或DESC
指定升序或者降序的索引值存储。
2.1 创建表的时候创建索引(隐式创建)
# 在声明有主键约束、唯一性约束、外键约束的字段上,会自动的添加相关的索引
CREATE TABLE dept(
dept_id INT PRIMARY KEY AUTO_INCREMENT, # 主键约束
dept_name VARCHAR(20)
);
CREATE TABLE emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT, # 主键约束
emp_name VARCHAR(20) UNIQUE, # 唯一性约束
dept_id INT, # 外键约束
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);
2.2 显示创建
1.普通索引
CREATE TABLE book(
book_id INT ,
book_name VARCHAR(100),
authors VARCHAR(100),
info VARCHAR(100) ,
comment VARCHAR(100),
year_publication YEAR,
INDEX idx_yp(year_publication)
);
2.唯一索引
CREATE TABLE test1(
id INT NOT NULL,
name varchar(30) NOT NULL,
UNIQUE INDEX uk_idx_id(id)
);
3.主键索引
# 由主动约束去让主键索引自动创建
CREATE TABLE student (
id INT(10) UNSIGNED AUTO_INCREMENT,
student_no VARCHAR(200),
student_name VARCHAR(200),
PRIMARY KEY(id)
);
删除主键索引
# 删除主键索引,主键设置自增删除会出错
ALTER TABLE student drop PRIMARY KEY ;
4.单列索引
# single_idx_name为索引名
CREATE TABLE test2(
id INT NOT NULL,
name CHAR(50) NULL,
INDEX single_idx_name(name(20))
);
5.组合索引
CREATE TABLE test3(
id INT(11) NOT NULL,
name CHAR(30) NOT NULL,
age INT(11) NOT NULL,
info VARCHAR(255),
INDEX multi_idx(id,name,age)
);
6.全文索引
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR (200),
body TEXT,
FULLTEXT index (title, body)
) ENGINE = INNODB ;
创建了一个给title和body字段添加全文索引的表。在MySQL5.7及之后版本中可以不指定最后的ENGINE了,因为在此版本中InnoDB支持全文索引。不同于like方式的的查询,全文索引用match+against方式查询:
SELECT * FROM articles WHERE MATCH(title, body) AGAINST ('phone');
2.3 在已经存在的表上创建索引
- 使用ALTER TABLE语句创建索引 ALTER TABLE语句创建索引的基本语法如下:
ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY]
[index_name] (col_name[length],...) [ASC | DESC]
- 使用CREATE INDEX创建索引 CREATE INDEX语句可以在已经存在的表上添加索引,在MySQL中,
CREATE INDEX被映射到一个ALTER TABLE语句上,基本语法结构为:
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
ON table_name (col_name[length],...) [ASC | DESC]
3. 删除索引
- 使用ALTER TABLE删除索引 ALTER TABLE删除索引的基本语法格式如下:
ALTER TABLE table_name DROP INDEX index_name;
- 使用DROP INDEX语句删除索引 DROP INDEX删除索引的基本语法格式如下:
DROP INDEX index_name ON table_name;
提示 删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成
索引的所有列都被删除,则整个索引将被删除。
边栏推荐
- WeChat public account background management
- flink The object probably contains or references non serializable fields.
- Official release丨VS Code 1.70
- ES进阶 数组功能语法新特性详解
- DOM-DOM树,一个DOM树有三种类型的节点
- A Practical Arrangement of Map GIS Development Matters (Part 1)
- 夫妻一方婚内向异性大额转款,怎么判
- 21天学习挑战赛第一周总结
- Salesforce disbands the Chinese team, which CRM product is more suitable for the Chinese
- What does the sanction of the mixer Tornado mean for the DeFi market?
猜你喜欢
添加用户报错useradd: cannot open /etc/passwd
The problem that Merge will be lost again after code Revert has been solved
ARM development (4) How to read the chip manual for novice Xiaobai, bare metal driver development steps and pure assembly to achieve lighting, assembly combined with c lighting, c to achieve lighting
ES进阶 数组功能语法新特性详解
《人生若如初见》命运多舛,人物饱满,朱亚文角色反差太惊喜
CSAPP Data Lab
ROS源代码阅读(1)
redis学习五redis的持久化RDB,fork,copyonwrite,AOF,RDB&AOF混合使用
[4G/5G/6G专题基础-154]: 5G无线准入控制RAC(Radio Admission Control)
Summary of Logstash log data write exception troubleshooting
随机推荐
A practice arrangement about map GIS (below) GIS practice of Redis
①CAS SSO单点登录框架源码深度分析
【LeetCode】Day112-重复的DNA序列
架构篇(二)架构的复杂度来源
维特智能惯导配置
Goodbye Guangzhou paper invoices!The issuance of electronic invoices for accommodation fees will completely replace the invoices of hotels, restaurants and gas stations
Idea (优选)cherry-pick操作
The problem that Merge will be lost again after code Revert has been solved
CSAPP Data Lab
代码 Revert 后再次 Merge 会丢失的问题,已解决
ES进阶 函数功能语法新特性详解
shell脚本入门
Goodbye Chengdu paper invoices!The issuance of electronic invoices for accommodation expenses will soon completely replace the invoices of hotels, catering and gas stations
js中的this问题
Mysql_Note5
掌握这几招,轻松K.O面试官,Offer拿到吐
求和、计数的窗口函数应用
Realization of vending machine function based on FPGA state machine
Vim and copy and paste from the outside (don't need to install the plugin)
(Nips-2015) Spatial Transformer Network