【MYSQL】其他索引的创建使用方式

MySQL其他索引的创建使用方式

   前面的案例中,聊到了咱们有三种方式创建索引,在创建时可通过INDEX、KEY两个关键字创建,但这种方式建立的索引仅是普通索引,接着再来聊一聊MySQL数据库其他类型的索引该如何创建以及使用。

但不管是何种类型的索引,都可以通过前面聊到的三种方式创建。

1.1、唯一索引的创建与使用

   唯一索引在创建时,需要通过UNIQUE关键字创建:如下:

-- 方式①
CREATE UNIQUE INDEX indexName ON tableName (columnName(length));-- 方式②
ALTER TABLE tableName ADD UNIQUE INDEX indexName(columnName);-- 方式③
CREATE TABLE tableName(  columnName1 INT(8) NOT NULL,   columnName2 ....,.....,UNIQUE INDEX [indexName] (columnName(length))  
);

在已有的表基础上创建唯一索引时要注意,如果选用的字段,表中字段的值存在相同值时,这时唯一索引是无法创建的,比如:

SELECT * FROM `zz_article`;
+------------+--------------------------+-------------------+
| article_id | article_name             | special_column    |
+------------+--------------------------+-------------------+
|          1 | MySQL架构篇:.......     | 《全解MySQL》     |
|          2 | MySQL执行篇:.......     | 《全解MySQL》     |
|          3 | MySQL设计篇:.......     | 《全解MySQL》     |
|          4 | MySQL索引篇:.......     | 《全解MySQL》     |
|          5 | MySQL索引篇:.......     | 《全解MySQL》     |
+------------+--------------------------+-------------------+CREATE UNIQUE INDEX i_article_name ON zz_article (article_name);

比如上述文章表中,第4、5条数据是重复的,此时创建利用SQL语句创建唯一索引,就会抛出1062错误码:

ERROR 1062 (23000): Duplicate entry 'MySQL索引篇:.......' for key 'i_article_name'

在这种情况下,就只能先删除重复数据,然后才能创建唯一索引成功。

同时,当唯一索引创建成功后,它同时会对表具备唯一约束的作用,当再使用INSERT语句插入相同值时,会同样会抛出1062错误码:

INSERT INTO `zz_article` VALUES(6,"MySQL索引篇:.......","《全解MySQL》");1062 - Duplicate entry 'MySQL索引篇:.......' for key 'i_article_name'

这里会提示你插入的哪个值,已经在表中存在,因此无法插入当前这条数据。

1.2、主键索引的创建与使用

   前面聊到过,主键索引其实是一种特殊的唯一索引,但主键索引却并不是通过UNIQUE关键字创建的,而是通过PRIMARY关键字创建:

-- 方式①
ALTER TABLE tableName ADD PRIMARY KEY indexName(columnName);-- 方式②
CREATE TABLE tableName(  columnName1 INT(8) NOT NULL,   columnName2 ....,.....,PRIMARY KEY [indexName] (columnName(length))  
);

在这里要注意:

  • 创建主键索引时,必须要将索引字段先设为主键,否则会抛1068错误码。
  • 这里也不能使用CREATE语句创建索引,否则会提示1064语法错误。
  • 同时创建索引时,关键字要换成KEY,并非INDEX,否则也会提示语法错误。

还是以之前的文章表为例,如下:

 
-- 对非主键字段创建主键索引
ALTER TABLE zz_article ADD PRIMARY KEY i_special_column(special_column);
-- 报错信息如下:
1068 - Multiple primary key defined-- 使用CREATE关键字创建主键索引
CREATE PRIMARY KEY i_article_id ON zz_article (article_id);
-- 报错信息如下:
1064 - You have an error in your SQL syntax; check....-- 使用INDEX关键字创建索引
ALTER TABLE zz_article ADD PRIMARY INDEX i_article_id(article_id);
-- 报错信息如下:
1064 - You have an error in your SQL syntax; check....-- 创建主键索引正确的方式
ALTER TABLE zz_article ADD PRIMARY KEY i_article_id(article_id);

当然,一般主键索引都会在建表的DDL语句中创建,不会在表已经建立后再创建。

但似乎无论在讲普通索引,还是唯一索引、主键索引的时候,我们都没有讲如何使用这些创建好的索引查询数据,其实这一点无需咱们考虑,参考之前《SQL执行篇》中查询语句的执行流程,在一条SELECT语句来到MySQL时,会经历优化器优化的过程,而优化器则会自动帮咱们选择一个最合适的索引查询数据。当然,前提是查询条件中涉及到了索引字段才行。

前面也说过,你不想让优化器自动选择,也可以手动通过FORCE INDEX关键字强制指定。

1.3、全文索引的创建与使用

   全文索引和其他索引不同,首先如果你想要创建全文索引,那么MySQL版本必须要在5.7及以上,同时使用时也需要手动指定,一起来先看看如何创建全文索引,此时需要使用FULLTEXT关键字:

-- 方式①
ALTER TABLE tableName ADD FULLTEXT INDEX indexName(columnName);-- 方式②
CREATE FULLTEXT INDEX indexName ON tableName(columnName);

不过在创建全文索引时,有三个注意点:

  • 5.6版本的MySQL中,存储引擎必须为MyISAM才能创建。
  • 创建全文索引的字段,其类型必须要为CHAR、VARCHAR、TEXT等文本类型。
  • 如果想要创建出的全文索引支持中文,需要在最后指定解析器:with parser ngram

此时还依旧是以文章表为例,为文章名称字段创建一个全文索引,命令如下:

ALTER TABLE zz_article ADD 
FULLTEXT INDEX ft_article_name(article_name) 
WITH PARSER NGRAM;

创建好全文索引后,当你想要使用全文索引时,优化器这时不能自动选择,因为全文索引有自己的语法,但在了解如何使用之前,得先清楚两个概念:最小搜索长度和最大搜索长度,先来看看全文索引的一些参数,可通过show variables like '%ft%';命令查询,如下:


多余的参数就不介绍了,重点讲一下其中的几个重要参数:

  • ft_min_word_len:使用MyISAM引擎的表中,全文索引最小搜索长度。
  • ft_max_word_len:使用MyISAM引擎的表中,全文索引最大搜索长度。
  • ft_query_expansion_limitMyISAM中使用with query expansion搜索的最大匹配数。
  • innodb_ft_min_token_sizeInnoDB引擎的表中,全文索引最小搜索长度。
  • innodb_ft_max_token_sizeInnoDB引擎的表中,全文索引最大搜索长度。

那么究竟做最小搜索长度、最大搜索长度的作用是什么呢?其实这个是一个限制,对于长度小于最小搜索长度和大于最大搜索长度的词语,都无法触发全文索引。也就是说,如果想要使用全文索引对一个词语进行搜索,那这个词语的长度必须在这两个值之间。

其实这两个值自己可以手动调整的,最小值可以手动调整为1MyISAM引擎的最大值可以调整为3600,但InnoDB引擎最大似乎就是84

OK~,了解全文索引中的一些概念后,接下来看看如何使用全文索引,全文索引中有两个专门用于检索的关键字,即MATCH(column)、AGAINST(关键字),同时这两个检索函数也支持三种搜索模式:

  • 自然语言模式(默认搜索模式)
  • 布尔搜索模式
  • 查询拓展搜索

MATCH()主要是负责指定要搜索的列,这里要指定创建全文索引的字段,AGAINST()则指定要搜索的关键字,也就是要搜索的词语,接下来简单的讲一下三种搜索模式。

自然语言模式

这种模式也是在使用全文索引时,默认的搜索模式,使用方法如下:

+------------+--------------------------+-------------------+
| article_id | article_name             | special_column    |
+------------+--------------------------+-------------------+
|          1 | MySQL架构篇:.......     | 《全解MySQL》     |
|          2 | MySQL执行篇:.......     | 《全解MySQL》     |
|          3 | MySQL设计篇:.......     | 《全解MySQL》     |
|          4 | MySQL索引篇:.......     | 《全解MySQL》     |
+------------+--------------------------+-------------------+SELECT COUNT(article_id) AS '搜索结果数量' 
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('MySQL');-- 运行结果如下:
+--------------+
| 搜索结果数量 |
+--------------+
|           4 |
+--------------+
一眼看过去,SQL就能看懂,毕竟都可以排版了一下SQL,不过多介绍了。唯一要注意的是,如果给定的关键词长度小于默认的最小搜索长度,那是无法使用全文索引的,比如下述这条SQL就不会触发:
SELECT COUNT(article_id) AS '搜索结果数量' 
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('M');
布尔搜索模式

布尔搜索模式有些特殊,因为在这种搜索模式中,还需要掌握特定的搜索语法:

  • +:表示必须匹配的行数据必须要包含相应关键字。
  • -:和上面的+相反,表示匹配的数据不能包含相应的关键字。
  • >:提升指定关键字的相关性,在查询结果中靠前显示。
  • <:降低指定关键字的相关性,在查询结果中靠后显示。
  • ~:表示允许出现指定关键字,但出现时相关性为负。
  • *:表示以该关键字开头的词语,如A*,可以匹配A、AB、ABC....
  • "":双引号中的关键字作为整体,检索时不允许再分词。
  • "X Y"@n""包含的多个词语之间的距离必须要在n之间,单位-字节,如:
    • 竹子 熊猫@10:表示竹子和熊猫两个词语之间的距离要在10字节内。
  • .......

举个几个例子使用一下,如下:

-- 查询文章名中包含 [MySQL] 但不包含 [设计] 的数据
SELECT *
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('+MySQL -设计' IN BOOLEAN MODE);-- 查询文章名中包含 [MySQL] 和 [篇] 的数据,但两者间的距离不能超过10字节
SELECT *
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('"MySQL 篇"@10' IN BOOLEAN MODE);-- 查询文章名中包含[MySQL] 的数据,
--    但包含 [执行] 关键字的行相关性要高于包含 [索引] 关键字的行数据
SELECT *
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('+MySQL +(>执行 <索引)' IN BOOLEAN MODE);-- 查询文章名中包含 [MySQL] 的数据,但包含 [设计] 时则将相关性降为负
SELECT *
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('+MySQL ~设计' IN BOOLEAN MODE);-- 查询文章名中包含 [执行] 关键字的行数据
SELECT *
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('执行*' IN BOOLEAN MODE);-- 查询文章名中必须要包含 [MySQL架构篇] 关键字的数据
SELECT *
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('"MySQL架构篇"' IN BOOLEAN MODE);

同样的,上述的SQL语句应该都能看明白,最后的IN BOOLEAN MODE表示使用布尔搜索模式,除此外,大家唯一疑惑的就在于:相关性这个词,其实这个词也不难理解,就是检索数据后,数据的优先级顺序,当相关性越高,对应数据在结果中越靠前,当相关性为负,则相应的数据排到最后。

查询拓展搜索

查询拓展搜索其实是对自然语言搜索模式的拓展,比如举个例子:

SELECT COUNT(article_id) AS '搜索结果数量' 
FROM `zz_article` 
WHERE MATCH(article_name) AGAINST('MySQL' WITH QUERY EXPANSION);

在自然语言模式的查询语句基础上,最后面多加一个WITH QUERY EXPANSION表示使用查询拓展搜索,这种模式下会比自然语言模式多一次检索过程,比如上述的例子中:

  • 首先会根据指定的关键字MySQL进行一次全文检索。
  • 然后第二阶段还会对指定的关键进行分词,然后再进行一次全文检索。

之前介绍全文索引参数时,也列出来了一个名为ft_query_expansion_limit的参数,这个参数就是控制拓展搜索时的拓展行数的,最大可以调整到1000。但由于Query Expansion的全文检索可能带来许多非相关性的查询结果,因此在实际情况中要慎用!!!

实际上,全文索引引入MySQL后,可以用它代替之前的like%模糊查询,效率会更高。

1.4、空间索引的创建与使用

   空间索引这玩意儿实际上很多项目不会用到,我用的次数也不多,但如果你要用到这个索引,那可以通过SPATIAL关键字创建,如下:

ALTER TABLE tableName ADD SPATIAL KEY indexName(columnName);

但在创建空间索引的时候,有几个注意点需要牢记:

  • 目前MySQL常用引擎中,仅有MyISAM支持空间索引,所以表引擎必须要为它。
  • 空间索引必须要建立在类型为GEOMETRY、POINT、LINESTRING、POLYGON的字段上。

这个用的较少,就不展开细聊了~

1.5、联合索引的创建与使用

   联合索引呢,实际上并不是一种逻辑索引分类,它是索引的一种特殊结构,前面给出的所有案例中,都仅仅是在单个字段的基础上建立索引,而联合索引的意思是可以使用多个字段建立索引。那该如何创建联合索引呢,不需要特殊的关键字,方法如下:

CREATE INDEX indexName ON tableName (column1(length),column2...);
ALTER TABLE tableName ADD INDEX indexName(column1(length),column2...);
  • 你可以使用INDEX关键字,让多个列组成一个普通联合索引
  • 也可以使用UNIQUE INDEX关键字,让多个列组成一个唯一联合索引
  • 甚至还可以使用FULLTEXT INDEX关键字,让多个列组成一个全文联合索引
  • .......

但是前面也提过,SELECT语句的查询条件中,必须包含组成联合索引的第一个字段,此时才会触发联合索引,否则是无法使用联合索引的。

二、索引初识篇总结

   OK~,在本篇中就对MySQL的索引机制有了全面认知,从索引的由来,到索引概述、索引管理、索引分类、唯一/全文/联合/空间索引的创建与使用等内容,进行了全面概述,相信本章看下来,足够让你对MySQL索引机制有一个系统化的体系,那么我们下篇再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域&#xff0c;比较常用的轻量化软件交付方式&#xff0c;该技术是将3D应用等大模型的算力执行放在了服务器端&#xff0c;而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多&#xff0c;实时云渲染平台的国产信创化…

Games101Homework【6】Acceleration structure(Including framework analysis)

Code Analysis&#xff1a; friend&#xff1a; C中友元&#xff08;友元函数和友元类&#xff09;的用法和功能_friend class a<b>-CSDN博客 [C&#xff1a;不如Coding]&#xff08;11&#xff09;&#xff1a;友元函数与友元类_哔哩哔哩_bilibili Here is a simple…

二维数组---刷题

一维数组不想更了&#xff0c;弄点二维数组&#xff01; 1.对角线 已知一个6*6的矩阵&#xff0c;把矩阵两条对角线上的元素加上10&#xff0c;然后输出这个新矩阵。 思路 题目简单&#xff0c;6*636&#xff0c;可以得知有36个元素。数组就定义成a[7][7]&#xff0c;难点在与…

软考数据库---3.关系数据库

3.1 名词 属性分类 数据库实体属性分类主要包括以下几个方面&#xff1a; 标识属性 (Key Attribute / Identifier): 这些属性是用来唯一识别实体实例的关键属性&#xff0c;也称为主键&#xff08;Primary Key&#xff09;。在数据库表中&#xff0c;每个实体的实例&#xff0…

深入解析实时数仓Doris:介绍、架构剖析、应用场景与数据划分细节

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! Doris是一款高性能、开源的实时分析数据仓库&#xff0c;旨在为用户提供毫秒级查询响应、高并发、高可用以及易于扩展的OLAP解决方…

【深度学习实战(5)】使用OPENCV库实现自己的letter_box操作

一、letter_box 深度学习模型输入图片的尺寸为正方形&#xff0c;而数据集中的图片一般为长方形&#xff0c;粗暴的resize会使得图片失真&#xff0c;采用letterbox可以较好的解决这个问题。该方法可以保持图片的长宽比例&#xff0c;剩下的部分采用灰色填充。 二、代码 本例…

c语言->贪吃蛇实战技巧结合EasyX简单实现页面管理(简单实现)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1. 游戏背景 贪吃蛇是久负盛名的游戏&#xff0c;它也和俄罗斯⽅…

AndroidAutomotive模块介绍(二)应用及接口介绍

前言 上一篇文章中从整体角度描述了 Android Automotive 模块。本篇文章将对 Android Automotive 中的 APP 以及 API 部分展开描述。 上一篇&#xff1a;AndroidAutomotive模块介绍&#xff08;一&#xff09;整体介绍 下一篇&#xff1a;AndroidAutomotive模块介绍&#xff0…

python-study-day2

pycharm注释(也可修改) 快捷键ctrl /手敲一个 " # " 这个是单行注释""" """ 左边这个三个引号可以完成多行注释 基础知识 常用的数据类型 def hello(self):print("Hello")print(type(1)) print(type("1"…

图片超分辨率重构实战——SRGAN

数据与代码链接见文末 论文地址:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network https://arxiv.org/abs/1609.04802v4 1.概述 通常来说,分辨率越低,图像越模糊,分辨率越高,图像越清晰,图像超分辨率重构就是将分辨率低的图像重…

OceanBase V4.2 MySQL模式下,如何通过DBLINK实现跨数据源访问

概述 跨数据源访问可通过 DBLINK&#xff08;以下简称DBLINK&#xff09;实现&#xff0c;从而使得业务代码能够像访问本地数据库一样轻松访问远端数据库。原先&#xff0c;DBLINK主要服务于Oracle模式&#xff0c;但由于OceanBase 的MySQL模式租户同样存在访问远端数据库的需…

基于Springboot+Vue的Java项目-旅游网站系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

K-means和逻辑回归

逻辑回归 一个事件的几率是该事件发生的概率/该事件不发生的概率&#xff1a;P/&#xff08;1-P&#xff09; 对数几率是&#xff1a;log(P/&#xff08;1-P&#xff09;) **考虑对输入x分类的模型&#xff1a;**log(P/&#xff08;1-P&#xff09;)wx 则 Pexp(wx)/(exp(w*x)…

Ubuntu上安装Python3.11-源码编译

1、下载依赖 sudo apt install -y wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev 2、上传文件 &#xff0c;解压并进入 tar -xf Python-3.11.0.tar.xz 3、编译 cd Pyt…

跟TED演讲学英文:The dark side of competition in AI by Liv Boeree

The dark side of competition in AI Link: https://www.ted.com/talks/liv_boeree_the_dark_side_of_competition_in_ai Speaker:Liv Boeree Date: October 2023 文章目录 The dark side of competition in AIIntroductionVocabularyTranscriptSummary后记 Introduction Co…

实验5 流程图和盒图ns图

一、实验目的 通过绘制流程图和盒图&#xff0c;熟练掌握流程图和盒图的基本原理。 能对简单问题进行流程图和盒图的分析&#xff0c;独立地完成流程图和盒图设计。 二、实验项目内容&#xff08;实验题目&#xff09; 1、用Microsoft Visio绘制下列程序的程序流程图。 若…

浏览器工作原理与实践--渲染流水线:CSS如何影响首次加载时的白屏时间

在上一篇文章中我们详细介绍了DOM的生成过程&#xff0c;并结合具体例子分析了JavaScript是如何阻塞DOM生成的。那本文我们就继续深入聊聊渲染流水线中的CSS。因为CSS是页面中非常重要的资源&#xff0c;它决定了页面最终显示出来的效果&#xff0c;并影响着用户对整个网站的第…

数据结构复习指导之绪论(数据结构的基本概念)

文章目录 绪论&#xff1a; 考纲内容 知识框架 复习提示 1.数据结构的基本概念 1.1基本概念和术语 1.数据 2.数据元素 3.数据对象 4.数据类型 5.数据结构 1.2数据结构三要素 1.数据的逻辑结构 2.数据的存储结构 3.数据的运算 绪论&#xff1a; 考纲内容 算法时…

开源AI图像识别:支持文件批量识别快速对接数据库存储

随着数字化转型的不断深入&#xff0c;图像识别技术在各行各业中的应用越来越广泛。文件封识别作为图像识别技术的一个分支&#xff0c;能够有效地提高文件处理的自动化程度和准确性。本文将探讨文件封识别技术的原理、应用场景以及如何将识别后的内容批量对应数据库字段进行存…

CSS特效---HTML+CSS实现3D旋转卡片

1、演示 2、一切尽在代码中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title&…