• 索引的创建、查看、删除


    1. 索引分类

    • 功能逻辑上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。
    • 按照物理实现方式,索引可以分为 2 种:聚簇索引和非聚簇索引。
    • 按照作用字段个数进行划分,分成单列索引和联合索引。
    1. 普通索引

    在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,在表student的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询

    1. 唯一性索引

    使用UNIQUE参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引作用的列值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。例如,在表student的字段email中创建唯一性索引,那么字段email的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录

    1. 主键索刭

    主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也就是NOT NULL+UNIQUE,张表里最多只有一个主键索引。这是由主键索引的物理实现方式决定的,因为数据存储在文件中只能按照一种顺序进行存储。InnoDB主键索引就是聚簇索引

    1. 单列索引

    在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。一个表可以有多个单列索引。

    1. 多列(组合、联合)索引

    多列索引是在表的多个字段组合上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段中的第一个字段时才会被使用。例如,在表中的字段id、name和gender上建立一个多列索引idx_id_name_gender,只有在查询条件中使用了字段id时该索引才会被使用。使用组合索引时遵循最左前缀集合。

    1. 全文索引

    全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。

    使用参数FULLTEXT可以设置索引为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引只能创建在CHAR、VARCHAR 或TEXT类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。例如,表student的字段information是TEXT类型该字段包含了很多文字信息。在字段information上建立全文索引后,可以提高查询字段information的速度。全文索引典型的有两种类型:自然语言的全文索引和布尔全文索引。

    自然语言搜索引擎将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过50%的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。

    索引常用命令

    # 查看该表索引
    SHOW INDEX FROM student 
    
    • 1
    • 2

    2. 索引创建

    # [UNIQUE | FULLTEXT | SPATIAL]为指定创建索引类型
    # [INDEX | KEY]为创建索引关键字,两个都可以
    # 列名 [length],varchar类型的属性,可以指定索引作用的长度,比如只作用在前20个字符
    CREATE TABLE 表名([col_name data_type] 
    [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [索引名] (列名 [length]) [ASC | DESC]
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • UNIQUEFULLTEXTSPATIAL为可选参数,分别表示唯一索引、全文索引和空间索引;
    • INDEXKEY为同义词,两者的作用相同,用来指定创建索引;
    • index_name指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;
    • col_name为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
    • length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
    • ASCDESC指定升序或者降序的索引值存储。

    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)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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) 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    2.唯一索引

    CREATE TABLE test1( 
        id INT NOT NULL, 
        name varchar(30) NOT NULL, 
        UNIQUE INDEX uk_idx_id(id) 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    3.主键索引

    # 由主动约束去让主键索引自动创建
    CREATE TABLE student ( 
        id INT(10) UNSIGNED AUTO_INCREMENT, 
        student_no VARCHAR(200),
        student_name VARCHAR(200), 
        PRIMARY KEY(id) 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    删除主键索引

    # 删除主键索引,主键设置自增删除会出错
    ALTER TABLE student drop PRIMARY KEY ;
    
    • 1
    • 2

    4.单列索引

    # single_idx_name为索引名
    CREATE TABLE test2( 
        id INT NOT NULL, 
        name CHAR(50) NULL, 
        INDEX single_idx_name(name(20)) 
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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)
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    6.全文索引

    CREATE TABLE articles (
    	id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    	title VARCHAR (200),
    	body TEXT,
    	FULLTEXT index (title, body)
    ) ENGINE = INNODB ;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    创建了一个给title和body字段添加全文索引的表。在MySQL5.7及之后版本中可以不指定最后的ENGINE了,因为在此版本中InnoDB支持全文索引。不同于like方式的的查询,全文索引用match+against方式查询:

    在这里插入图片描述

    SELECT * FROM articles WHERE MATCH(title, body) AGAINST ('phone');
    
    • 1

    2.3 在已经存在的表上创建索引

    1. 使用ALTER TABLE语句创建索引 ALTER TABLE语句创建索引的基本语法如下:
    ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY]
    [index_name] (col_name[length],...) [ASC | DESC]
    
    • 1
    • 2
    1. 使用CREATE INDEX创建索引 CREATE INDEX语句可以在已经存在的表上添加索引,在MySQL中,
      CREATE INDEX被映射到一个ALTER TABLE语句上,基本语法结构为:
    CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    ON table_name (col_name[length],...) [ASC | DESC]
    
    • 1
    • 2

    3. 删除索引

    1. 使用ALTER TABLE删除索引 ALTER TABLE删除索引的基本语法格式如下:
    ALTER TABLE table_name DROP INDEX index_name;
    
    • 1
    1. 使用DROP INDEX语句删除索引 DROP INDEX删除索引的基本语法格式如下:
    DROP INDEX index_name ON table_name;
    
    • 1

    提示 删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成
    索引的所有列都被删除,则整个索引将被删除。

  • 相关阅读:
    MVC第三波书店用户Model
    cesium 实战记录(六)地图通用工具方法的封装
    c# 同步异步锁
    python之阈值分割
    【快应用】input组件的输入框弹出后,如何点击其他地方后失去焦点,并收起键盘
    Redis —— 一次错误记录
    耐腐蚀特氟龙塑料材质PFA烧杯超纯试剂反应杯
    Python电网静态和准静态分析及自动化优化
    大模型时代下向量数据库的创新与变革
    光学红外雨量IFR202型传感器智慧检测雨量场景等行业
  • 原文地址:https://blog.csdn.net/pmc0_0/article/details/126260056