【详解】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索引的基本操作,索引(主键索引,普通索引,组合索引,唯一索引) 的相关文章

  • MS Access:在列中搜索星号/星号

    我正在寻找一种方法来搜索包含字符串数据类型的列 问题是星号或星号是保留符号 以下查询无法正常工作 select from users where instr pattern 如何编写 Access 查询来搜索列中的星号 您可以使用方括号在
  • _mysql_connector.MySQLInterfaceError:命令不同步;您现在无法运行此命令 python msql.connector

    我有一个功能 您可以在下面看到 如果运行此函数 我将收到您在标题中看到的错误 您能帮助我吗 不久前我能够用锁解决这个问题 但现在它们不起作用 我知道这与我的连接有关 但我不知道如何解决这个问题 def insertNewValues sel
  • 安全转义表名/列名

    我在 php 中使用 PDO 因此无法使用准备好的语句转义表名或列名 以下是我自己实现它的万无一失的方法 tn str replace REQUEST tn column str replace REQUEST column sql SEL
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • 从本地 html/javascript 网站插入 mySQL 数据库

    我正在尝试做什么 我的程序的目的是插入数据local HTML JS网站变成online 非本地 mySQL数据库 到目前为止我尝试过的 我试图用来实现此目的的原始方法是让我的本地网站使用 javascript 通过在线发布数据PHP文件
  • 向 yahoo 和 hotmail 用户发送电子邮件?

    我正在使用 php 和 mysql 每次用户在我的网站上注册时 我都会使用 php mail 发送一封电子邮件进行身份验证 最近我发现 很多Yahoo和Hotmail用户还没有激活他们的帐户 假设 1000 个用户中 只有 200 个被激活
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • 当我耗尽 bigint 生成的密钥时会发生什么?怎么处理呢?

    我自己无法想象一个好的答案 所以我想在这里问 在我心里 我总是想知道 如果AUTO INCREMENT PRIMARY ID我的专栏MySQL表用完了吗 举例来说 我有一个有两列的表 一个ID auto increment primary
  • 测验程序的 MySql 数据库设计

    我目前正在开发一个项目 主要是创建一个测验应用程序 它将能够进行包含 10 到 20 个问题的多项选择题或简答题的测验 它需要能够根据正确答案检查用户的答案 然后对用户的答案进行评分 稍后 我可能会实现一个后端功能来在线创建测验 但现在我将
  • TCPDF - 来自 mysql 的打印表显示重复的第一行

    我是 TCPDF 的新手 我面临的小问题是所有输出数据都显示同一行 我的意思是第一条记录重复数据库中存在的总数据 行 的次数 这是我的代码 tbl header
  • 未找到教义列:1054“字段列表”中未知列“s.features”

    我在站点表中添加了一个新列 features 并使用 Doctrine 重新生成了模型 此代码导致错误 siteTable Doctrine Core getTable Site site siteTable gt findOneByNam
  • 为什么不能将 MYSQL 函数传递到准备好的 PDO 语句中?

    在我看来 以下脚本应该有效 stmt db gt prepare UPDATE table SET status date modified stmt gt execute array 1 NOW 但经过时NOW 进入准备好的声明中 什么也
  • 将数据从 MS SQL 导入 MySQL

    我想从 MS SQL Server 导入数据 通过某种正则表达式运行它以过滤掉内容 然后将其导入 MySQL 然后 对于每个查询 我希望显示来自第三个数据库的相关图像 明智地导入和链接 最简单的方法是什么 谢谢 澄清 它是一个 PHP 应用
  • 如何将值从 android 传递到 php Web 服务并检索它?

    我正在尝试将一个值传递给我的 php web 服务 我已经使用此代码来传递 名称 值 private class MyAsyncTask extends AsyncTask
  • MySQL 过去 12 个月的月度销售情况,包括没有销售的月份

    SELECT DATE FORMAT date b AS month SUM total price as total FROM cart WHERE date lt NOW and date gt Date add Now interva
  • 如何删除非空约束?

    假设创建了一个表 如下所示 create table testTable colA int not null 您将如何删除非空约束 我正在寻找类似的东西 ALTER TABLE testTable ALTER COLUMN colA DRO
  • ORDER BY id 或 date_created 显示最新结果?

    我有一个表 实际上有几个 我想首先从中获取最新条目的结果 这是我的ORDER BY条款选项 date created INT 从不改变值 id 当然是INT AUTO INCRMENT 两列应同等地代表记录插入的顺序 我自然会使用date
  • 将程序存储在 phpMyAdmin 中

    我必须将存储过程添加到 MySQL 数据库 问题是托管提供php我的管理员来管理数据库 我在网上搜索了一下 想法是运行创建程序的MySQL本机语句 但由于程序的代码通常可能有 我们必须更改 MySQL 中的分隔符 php我的管理员没有这个选
  • 子查询与连接

    我重构了从另一家公司继承的应用程序的一个缓慢部分 以使用内部联接而不是子查询 例如 WHERE id IN SELECT id FROM 重构后的查询运行速度提高了约 100 倍 50 秒到 0 3 我预计会有改进 但谁能解释为什么它如此剧
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null

随机推荐

  • 关闭套接字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博客 前言 索引是什么 索引是一种单独的 物理的对数据库表中一列或多列的值进行排序的一种存储结构 它是某个表中一列或若干列值的集合和相应的指向