【MySQL数据库 | 第十八篇】索引分类与语法

news2024/11/25 12:56:50

前言: 

在上一篇我们讲解了什么是索引以及索引的结构,这一篇我们将更进一步的讲解索引的分类以及语法介绍,大家准备好了嘛?

索引分类: 

  • 1. 主键索引
  •        主键索引是一种特殊的唯一索引,它强制保证某列的值唯一性,不允许该列存在NULL值。因此,主键索引通常被用作表中记录的唯一标识符,可以极大的提高查询效率。如果没有为表定义主键索引,Mysql会使用一个内置的隐藏主键自动创建主键索引。
  • 2. 唯一索引
  •        唯一索引也是强制保证列值的唯一性,不过和主键索引的区别在于它允许NULL值,也可以定义多个唯一索引。在插入或更新数据时,唯一索引会自动检查是否有冲突,因此使用唯一索引来定义表的主键也是一种常用的方式。
  • 3. 常规索引
  •        常规索引是最基本的索引类型,它会对列的值进行二叉树排序,可以支持基于等值和范围查询的高效检索。常规索引可以通过CREATE INDEX语句或ALTER TABLE语句添加到表中,也可以使用前缀索引来减小索引大小。
  • 4. 全文索引
  •        全文索引是用于处理文本数据的一种特殊索引类型,它可以对文本列的词汇或词组进行分析和索引,从而支持基于自然语言的检索。与常规索引不同,全文索引不是基于二叉树结构,而是基于倒排索引结构。在MySQL中,全文索引只能用于MyISAM引擎,也可用于InnoDB引擎的全文索引(InnoDB全文索引需要MySQL版本大于5.6)。

总的来说,虽然这些索引类型都可以提高数据库的查询性能,但具体使用哪种类型还需要根据应用场景的具体需求来合理选择。例如,主键索引通常用于作为表的唯一标识,常规索引可用于WHERE条件中经常用到的字段,而全文索引则适用于处理文本数据的搜索和分析等场景

而在InnoDB存储引擎之中,我们又把又把引擎分为了两大类:

  • 聚集索引(Clustered index):将数据存储和索引放到了一块,索引结构的叶子节点保存了行数据,特点是必须有,而且只有一个。
  • 二级索引(Secondary index):将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键,特点是可以存在多个。 

正确理解这两个索引很重要,很多SQL优化都是在围绕着聚集索引和二级索引来做的。 

聚集索引的选取规则:

  •  如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一的(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,也没有合适的唯一索引,那么InnoDB会自动生成一个rowid作为隐藏的聚集索引。

如图所示  id  为 聚集索引,name  为 二级索引

 而我们在查询的时候,例如查询名字叫做Arm人的全部信息,内部的查询步骤应该是:先在二级索引中查询名字叫做Arm的人的id,查询到之后,我们再在聚集索引里面查询哪一个叶子节点的id值为Arm的id,查询到之后,因为该叶子节点存储着整行的信息,我们也就获得了Arm的全部信息。我们把这种查询方式叫做查询。

 例题:
1.以下两个SQL语句哪一个执行效率高?

  • select * from user where id =10;
  • select * from user where name = 'Arm';
  • 备注:id为主键,name创建的字段有索引 

解答:第一个语句的执行速度快,因为id为主键,而主键自动绑定聚集索引,聚集索引的叶子字节点存储的就是整行的信息,我们只用查询一次就可以,而第二个语句的name的索引是二级索引,我们要先在二级索引中找到聚集索引的id,才可以进入聚集索引。因此第二个语句执行效率没有第一个语句高。

索引的语法:

1. 创建索引

在MySQL中,创建索引的语法格式为:

CREATE [UNIQUE] [INDEX|KEY] index_name
ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...)

其中,‘ UNIQUE ’是指创建的是一个唯一索引。`INDEX`和`KEY`是等价的关键字,`index_name`是索引的名称,`table_name`是要创建索引的表名,`column1, column2, ...`是要创建索引的列名,`ASC`和`DESC`是可选的排序方式。

2. 删除索引

在MySQL中,删除索引的语法格式为:

DROP INDEX index_name ON table_name

其中,`index_name`是要删除的索引的名称,`table_name`是要删除索引的表名。

3. 查看索引

在MySQL中,查看索引的语法格式为:

SHOW INDEX FROM table_name

其中,`table_name`是要查看索引的表名。

4. 强制使用索引

在MySQL中,可以使用`FORCE INDEX`或`USE INDEX`语句强制使用某个索引,语法格式如下:


SELECT column_list
FROM table_name
FORCE INDEX (index_name)
WHERE condition_list

或者:

SELECT column_list
FROM table_name
 USE INDEX (index_name)
WHERE condition_list

其中,`column_list`是要查询的列名列表,`table_name`是要查询的表名,`condition_list`是查询条件,`index_name`是要使用的索引名称。

总结:

        索引是SQL中比较重要的一个章节,他的概念繁杂众多,但是都比较重要一点,因为我们的优化大多数都是围绕着索引在做的,因此学好索引至关重要,下一篇文章我们将利用实例来显示索引的创建,删除,查看,感谢各位的支持。

今天的内容到这里就结束了,感谢大家的阅读。

如果我的内容对你有帮助,请点赞,评论,收藏创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

chatgpt赋能python:Python-查看已安装的库

Python - 查看已安装的库 Python 作为一种流行的编程语言,具有丰富的标准库和大量的第三方库,这些库可以方便地进行开发,缩短开发周期并提高代码质量。但是,随着时间的推移和项目累积,我们可能会忘记在当前机器上已经…

【瑞萨RA_FSP】电位器电压采集

文章目录 一、硬件设计二、软件设计1. 文件结构2. FSP配置3. ADC初始化函数4. ADC中断回调函数5. 如果未启用中断6. ADC读取转换结果函数7. hal_entry入口函数 一、硬件设计 野火启明6M5开发板的 ADC 电位器电路图如图所示。 可知,开发板板载的电位器连接到 P000 …

随机森林特征重要性(Variable importance)评估方法

Random Forest Variable importance 算法介绍实现算法流程分类回归 实验实验1:waveform数据集(分类)实验2:superconductivity数据集(回归)实验3:power-consumption数据集(回归&#…

UNIX环境高级编程——进程间通信

15.1 引言 本章将说明进程之间相互通信技术——进程间通信(InterProcess Communication,IPC)。 IPC类型包括: 前10种IPC形式通常限于同一台主机的两个进程之间的IPC;最后2种是仅有的支持不同主机上两个进程之间的I…

5G NR SRS功率控制

3GPP TS 38.213 7.3.1节中,关于SRS的功率控制算法如下: 其中, : 表示在载波f服务小区c以及SRS的发送时隙i UE被配置的最大发射功率; : 表示在载波f,BWP b, 服务小区c,SRS资源集qs所配置的p0值&#xff1…

【GateWay快速入门】 —— 每天一点小知识

💧 Z o o K e e p e r 快速入门 \color{#FF1493}{ZooKeeper快速入门} ZooKeeper快速入门💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 《数据结构与算法》专…

子线程不显示Toast?

Handler不仅在ANR过程中有用到,Toast中也用到了Handler。 代码如下: public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.lay…

chatgpt赋能python:Python如何进行高效的查询?

Python如何进行高效的查询? 在Python中,查询是一项非常常见的操作,而高效的查询在数据量增大时可以显著提高程序的性能和效率。本文将介绍Python中的查询方式以及如何进行高效的查询操作。 Python中的查询方式 Python中查询的方式主要分为…

嵌入式容器源码解析

问题分析 不同于使用springmvc,在我们使用springboot时无需配置tomcat就可以直接使用,这就说明springboot已经在我们启动项目时将tomcat配置好了,接下来我们就来看看springboot底层是怎么实现的。 源码解析 ServletWebServerFactoryAutoConfiguratio…

基于Java乡镇自来水收费系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

chatgpt赋能python:如何使用Python查看当前路径

如何使用Python查看当前路径 作为一名有10年Python编程经验的工程师,我今天想和大家分享如何使用Python来查看当前路径。这在开发过程中非常有用,尤其是当需要导入文件或访问某个文件夹时。在本文中,我将介绍在Windows、Mac和Linux系统上如何…

深蓝学院C++基础与深度解析笔记 第 3 章 数组、 vector 与字符串

第 3 章 数组、 vector 与字符串 一、数组 将一到多个相同类型的对象串连到一起,所组成的类型 int a → int b[10] b的类型是int[10]; A、 数组的初始化方式: ● 缺省初始化 ● 聚合初始化( aggregate initialization ) int b[3…

ansible的部署和命令模块和playbooks剧本

系列文章目录 文章目录 系列文章目录一、Ansible1、Ansible简介2、Ansible特点及优势3、Ansible核心程序4、Ansible工作原理及流程5.部署Ansible自动化运维工具6、Ansible常用模块 二、playbooks剧本1.playbooks2、playbooks组成部分3、playbooks启动及检测 总结 一、Ansible …

简单的TCP网络程序·多进程、多线程(后端服务器)

前文链接 -- 简单的TCP网络程序单进程 上篇文章中,实现了TCP网络通信的的单进程版本,因为实现的是一个死循环的逻辑,是串行实运行的,显然这和实际中的TCP通信是不同的,为了解决这方面的问题,需要使用多进程…

B+树:MySQL数据库索引的实现

作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建…

chatgpt赋能python:Python怎么横着输出?

Python怎么横着输出? 如果你是一名有10年Python编程经验的工程师,你一定已经经历过许多项目,很可能你曾经需要对代码进行一些横向格式化或输出。Python作为一种高级编程语言,有各种各样的技巧和技能。在本文中,我们将…

node安装后的全局环境变量配置

安装node时,位置最好不要装在c盘,这里,我在D盘下创建了文件夹"node",安装地址选择在该文件夹下 一直next,直到安装结束,打开"node"文件夹,安装完后,里面的配置…

C++【STL】之vector的使用

文章目录: vector介绍vector使用1. 默认成员函数1.1 默认构造1.2 拷贝构造1.3 析构函数1.4 赋值重载 2. 迭代器2.1 正向迭代器2.2 反向迭代器 3. 容量操作3.1 获取空间数据3.2 空间扩容3.3 大小调整3.4 空间缩容 4. 数据访问4.1 下标随机访问4.2 获取首尾元素 5. 数…

chatgpt赋能python:Python怎么横向键盘输入?

Python怎么横向键盘输入? 如果你是一位使用Python进行编程的工程师,你肯定明白快速而准确地输入代码的重要性。现在,许多程序员都找到了一个方法来更快地输入代码-横向键盘输入。 什么是横向键盘输入? 横向键盘输入是一种方法&…

基于Java校园驿站管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…