【详解】MySQL索引的基本操作,索引(主键索引,普通索引,组合索引,唯一索引)

2023-11-17

索引底层原理:

【详解】面试必问:MySQL索引底层原理(基于B+Tree)_CodingLJ-CSDN博客

前言

索引是什么?

        索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单

        索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序

一、索引的基本操作

①索引的优点

        大大加快了数据的查询速度。

②索引的缺点

        1.维护索引需要耗费数据库的资源

        2.索引需要占用磁盘空间

        3.当对表的数据进行增删改的时候,增删改的速度会变慢,增删改对底层数据结构进行排序。因为要维护索引,速度会受到影响。

③索引的分类

1、InnoDB搜索引擎

a.主键索引

       数据库表中设定主键后,数据库会自动创建主键索引,在InnoDB引擎中主键索引也称之为局促索引。

b.单值索引(普通索引)

        即一个索引只包含单个列,一个表可以有多个单列索引。

c.唯一索引

        索引列的值必须唯一,但允许有空值。

d.组合索引(复合索引、联合索引)

        即一个索引包含多个列。

2、MyISAM

        full  Text 全文索引

        全文索引的索引类型为FULL Text,在定义索引的列上支持全文查找,运行插入重复的值和空值,只有MYISAM存储引擎支持的全文索引。        

④索引的创建

(1)主键索引

主键索引在建表的时候自动创建。

--主键索引是在建表的时候自动创建
create table t_user(
	`id` VARCHAR(20) PRIMARY KEY,
	`name` VARCHAR(20)
);
#查看索引
SHOW INDEX FROM t_user;

 (2)单列索引(普通索引)

   创建普通索引,共有2种方式:创建表的时候创建,创建表后进行创建索引

--创建普通索引,共有2种方式:创建表的时候创建,创建表后进行创建索引
CREATE INDEX name_index ON t_user(`name`);

--创建表的时候构建索引
CREATE TABLE t_user1(
	`id` VARCHAR(20) PRIMARY KEY,
	`name` VARCHAR(20),
	KEY(`name`)
);
-- 索引的名默认是字段名
SHOW INDEX FROM t_user1;

 (3)唯一索引

--创建唯一索引:唯一索引允许为null,只允许一个值为null
CREATE TABLE t_user2(
	`id` VARCHAR(20) PRIMARY KEY,
	`name` VARCHAR(20),
	UNIQUE(`name`)
);

SHOW INDEX FROM t_user2;

(4)复合索引(组合索引)

--创建复合索引(组合索引)
CREATE TABLE t_user3(
	id VARCHAR(20) PRIMARY KEY,
	`name` VARCHAR(20),
	age INT,
	KEY(`name`,age)
);
-- 创建复合索引,
CREATE INDEX nameageindex ON t_user3(`name`,`age`);

SHOW INDEX FROM t_user3;

  (5)删除索引

drop index 索引名 on 表名

二、索引面试题

创建的索引顺序是:

create index  idx_user on user(name,age,bir);

问:以下能否;使用索引查询出name,age,bir?

where name = # and bir = # and age = #  能否利用索引?    能

where name = # and age = # and bir = #  能否利用索引?    能

where age = # and bir = # 能否利用索引?                          不能

where bir = # and age = # and name = # 能否利用索引?      能

where age = # and bir = # 能否利用索引?                           不能

解释:

1、能否使用索引必须遵循的是最左前缀法则

2、mysql引擎在查询为了更好的利用索引,在查询过程中动态的调整查询字段的顺序以便利用索引。

这个问题解决了,要遵循1,2法则。但新的问题又来了。

为什么①②④可以使用索引,③⑤使用索引会失效?也就是为什么不遵循最左前缀原理,中间有间隙的查询或者不从第一个字段查询,会造成索引失效?为什么字段不会被命中?

好,下一篇博客就来讲一讲为什么索引会失效?什么情况下会失效?底层实现是什么样的?

MySQL索引为什么会失效?

【详解】面试必问:MySQL索引为什么会失效?最左匹配原则中间有间隙,为什么索引不会被命中?%开头索引为什么失效?范围查询索引为什么会失效?_CodingLJ-CSDN博客

索引底层原理:【详解】面试必问:MySQL索引底层原理(基于B+Tree)_CodingLJ-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【详解】MySQL索引的基本操作,索引(主键索引,普通索引,组合索引,唯一索引) 的相关文章

  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • 如何在列上创建外键,该列的每条记录都可能引用多个表之一中的列?

    我正在创建一个社交网络 它有新闻 照片等多个实体 可以有评论 由于所有评论都具有相同的列并且行为方式相同 唯一的区别是它们的类型 新闻 照片或将来添加的其他内容 我决定为所有评论创建一个表 其中的列名为type 它工作得很好 直到我决定将外
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • 比特纳米。重置mysql根密码

    我如何重置 MySQL 中的 root 密码和帐户 因为我按照如何为其他服务器授予权限的说明操作 并且意外地将 root 用户 Mysql 绑定到其他 IP 地址 现在看来我无法在 localhost 上以管理员身份登录 Thanks 您有
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希

随机推荐

  • 关闭套接字close还是shutdown

    close 这个函数会对套接字引用计数 1 一旦发现引用计数到0 就会对套接字进行彻底释放 并且会关闭tcp两个方向的数据流 因为套接字可以被多个进程共享 你可以理解为我们给每个套接字都设置了一个积分 如果我们通过fork的方式创建了子进程
  • 软件工程导论习题

    软件工程是软件工程专业的一门重要学科 掌握好软件工程原理是开发软件的重要基础知识 本博客对软件工程导论部分习题解释 以更加深理解 选择 1 业界存在三种需求分析方法 面向功能分析 面向对象分析和 B A 面向算法分析 B 面向数据分析 C
  • 使用ESP定律_手工脱壳

    ESP定律脱壳一般的加壳软件在执行时 首先要初始化 保存环境 保存各个寄存器的值 一般利用PUSHAD 相当于把所有寄存器都压栈 当加壳程序的外壳执行完毕以后 再来恢复各个寄存器的内容 通过跨区段的转移来跳到程序的OEP来执行原程序 简单点
  • lr(1)分析法 算数表达式 c语言,编译原理及技术期末考试复习试题整理

    2 1 考虑文法G S 其产生式如下 S L a L L S S 1 试指出此文法的终结符号 非终结符号 终结符号为 a 非终结符号为 S L 开始符号为 S 2 给出下列各句子的分析树 a a a a a a a a a a 3 构造下列
  • Ubuntu20.04 开机无法进入登陆界面,一致转圈圈解决方案

    昨天把一个新的主机装了显卡驱动 cudnn没装完就关机走人了 今天早上一开机发现显示了这个 我没拍照片 这里盗用别的博主的照片了 搜了一下 本着能省则省的原则先从最简单的情况试起 怀疑是Lightdm出了问题 借用一下博主原话 是安装了li
  • 机器视觉开源代码集合

    机器视觉开源代码集合 一 特征提取Feature Extraction SIFT 1 Demo program SIFT Library VLFeat PCA SIFT 2 Project Affine SIFT 3 Project SUR
  • (struts2学习篇)struts2文件上传

    第一步 编写相关相关文件上传Action public class UploadFileAction extends ActionSupport private static final long serialVersionUID 1L 相
  • Hive千亿级数据倾斜解决方案

    数据倾斜问题剖析 数据倾斜是分布式系统不可避免的问题 任何分布式系统都有几率发生数据倾斜 但有些小伙伴在平时工作中感知不是很明显 这里要注意本篇文章的标题 千亿级数据 为什么说千亿级 因为如果一个任务的数据量只有几百万 它即使发生了数据倾斜
  • 十种经典运放电路分析

    转载十一种经典运放电路分析 本文章为转载文章 只是为以后方便查阅 如有侵权 请联系本人 1 反向放大器 图一运放的同向端接地 0V 反向端和同向端虚短 所以也是0V 反向输入端输入电阻很高 虚断 几乎没有电流注入和流出 那么R1和R2相当于
  • python解决Net Frameword匹配问题及Failed building wheel for XXX

    文章目录 1 背景 2 错误描述 2 1 错误关键语句 1 2 2 错误关键语句 2 2 3 错误关键语句 3 3 原因 4 解决问题 5 总结 6 参考链接 1 背景 计划使用NI veristand的python依赖包 但是在安装的过程
  • 算法设计与分析--求最大子段和问题(蛮力法、分治法、动态规划法) C++实现

    算法设计与分析 求最大子段和问题 问题描述 给定由n个整数组成的序列 a1 a2 an 求该序列形如 的子段和的最大值 当所有整数均为负整数时 其最大子段和为0 利用蛮力法求解 int maxSum int a int n int maxS
  • openGauss和oracle的上下翻命令和自动补全

    openGauss的gsql需要加参数 r 才能支持上下翻命令和自动补全 gsql d postgres p 15400 r oracle的sqlplus也不支持上下翻命令和自动补全 使用rlwrap可以实现上下翻命令 但是还是不能实现自动
  • Could not load dynamic library ‘cudart64_110.dll‘; dlerror: cudart64_110.dll not found

    Could not load dynamic library cudart64 110 dll dlerror cudart64 110 dll not found 报错如下 解决方法1 不推荐 对后续使用影响大 解决方法2 验证代码 输出
  • python拼接两个或者多个视频文件

    拼接不同分辨率的视频文件 import os import linecache 读取指定路径下的所有文件并放入到列表中 root workspace videos codec videos codec evp test h264 file
  • 【毕设选题】小红书数据分析与可视化

    文章目录 0 前言 1 课题背景 2 数据库依赖 导入依赖包 3 分析服饰行业笔记数据趋势数据 3 1数据一览 3 2 可视化分析 3 3 可视化分析 4 分析服饰行业内容关键词数据 4 1 数据一览 4 2 可视化分析 5 分析服饰行业品
  • VUE map area coords自适应

  • java异步调用方法

    1 CompletableFuture 使用原生的CompletableFuture实现异步操作 加上对lambda的支持 可以说实现异步任务已经发挥到了极致 Test public void test2 throws Exception
  • 软件测试基础学习

    1 软件和软件测试 1 1 软件 软件组成 程序 数据 文档 软件的分类 按层次划分 系统软件 应用软件 按组织划分 商业软件 开源软件 按结构划分 单机软件 分布式软件 1 2缺陷的由来 软件缺陷的由来 Bug Defect 所有不满足需
  • 使用python写一个可以帮我混淆加密Lua脚本的程序

    首先 我们需要了解一下混淆加密的概念 混淆加密是指将程序代码进行特殊的处理 使其难以被人类理解或反编译 这有助于保护程序的版权和商业机密 对于使用 Python 编写的程序来说 我们可以使用第三方库 pyminifier 来混淆加密 Pyt
  • 【详解】MySQL索引的基本操作,索引(主键索引,普通索引,组合索引,唯一索引)

    索引底层原理 详解 面试必问 MySQL索引底层原理 基于B Tree CodingLJ CSDN博客 前言 索引是什么 索引是一种单独的 物理的对数据库表中一列或多列的值进行排序的一种存储结构 它是某个表中一列或若干列值的集合和相应的指向