mysql索引的理解

news2024/12/28 16:05:06

1、索引是什么?

  1. 索引:简单理解就是我们字典的目录,一个索引可以找得到多个记录。
    1. 作用加快我们数据库的查询速度。
    2. 索引本身较大,往往存储在磁盘的文件里。可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)
    3. 对数据进行排序,降低了排下序成本。
  2. 索引的由浅到深的理解:
    1. 如果数据拍成一条直线,那么二分查找就是最好的方法,所以可以将这些索引改做一颗二叉树,但是会出现所有的数据全部在一边形成链表,所以就需要将二叉树调正为平衡二叉树。
    2. 当数据变多,那么二叉树的高度变得太高。查询需要硬盘做I/O操作,硬盘的速度很慢,这不利于快速查询。由此引入了B树。
    3. 在B树中,每一个节点可以存放多条数据并且数据之间是有序的,并且一个节点分支可以有多个,查询的时候,从根节点开始,做二分查询,依次往下直到查找到对应的索引。
    4. 但是,B树也有缺点:
      1. 当查询数据在根节点附近时,查询速度很快,当数据在叶子节点时,查询速度就会变慢、可能变快,性能不稳定。
      2. 当做范围查找时,由于数据散落在树的各个节点上,所以查询时,需要在不同的节点上做I/o操作。
    5. 最后,引入的B+树就可以解决B树的问题。
      1. B+树将所有的数据全部放在叶子节点上,叶子节点存储索引和数据,非叶子节点存储指向其他索引的指针。这样,一个节点可以有更加多的子节点,树的高度变得更低。I/O次数更少。
      2. 叶子节点使用双向链表进行连接,数据之间是有序的,解决了范围查找。

2、索引的类型?

创建索引:

create index [index_mode] on [name]([mode1,model2]);
index_mode自定义索引名
name表名
mode列名
  1. 主键索引:索引列中的值必须是唯一的,不允许有空值。比如每个表的id字段。
  2. 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
CREATE INDEX index_name
ON table_name (column_name);
// 在表上创建一个简单的索引。允许使用重复的值:
  1. 唯一索引: 索引列中的值必须是唯一的,但是允许为空值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name);
// 在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
  1. 全文索引:只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。
CREATE FULLTEXT INDEX ft_idx_content ON articles (content);
  1. 空间索引:MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。
CREATE SPATIAL INDEX sp_idx_location ON parks (location);
  1. 前缀索引:在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

3、索引的数据结构?

  1. hash表:以键值对的方式存储数据。我们使用Hash表存储表数据Key可以存储索引列,Value可以存储行记录或者行磁盘地址。Hash表在等值查询时效率很高,时间复杂度为O(1);但是不支持范围快速查找,范围查找时还是只能通过扫描全表方式。
  2. 二叉查找树:每个节点最多有2个分叉,左子树和右子树数据顺序左小右大。但是可能出现数据成一条直线的情况。
  3. 平衡二叉树:不会出现左子树很高、右子树很矮的情况。和直线的树。但数据不能太多。不支持范围查找。
  4. B树:B树的节点中存储着多个有序的元素,每个内节点有多个分叉。叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接。但是不支持范围查询。
  5. B+树:B+树的最底层叶子节点包含了所有的索引项。叶子节点之间采用双向链表来连接。

4、mysql索引的实现?

  1. 在InnoDB存储引擎中,每个表都存在一个聚簇索引。一般情况下,聚簇索引等同于主键索引,当一个表没有创建主键索引时,InnoDB会自动创建一个ROWID字段来构建聚簇索引。InnoDB创建索引的具体规则如下:
    1. 在表上定义主键PRIMARY KEY,InnoDB将主键索引用作聚簇索引。
    2. 如果表没有定义主键,InnoDB会选择第一个不为NULL的唯一索引列用作聚簇索引。
    3. 如果以上两个都没有,InnoDB 会使用一个6 字节长整型的隐式字段 ROWID字段构建聚簇索引。该ROWID字段会在插入新行时自动递增。
    4. 除聚簇索引之外的所有索引都称为辅助索引。在中InnoDB,辅助索引中的叶子节点存储的数据是该行的主键值对。 在检索时,InnoDB使用此主键值在聚簇索引中搜索行记录。
    5. 当使用主键索引查询,从主键索引树的根节点开始,知道叶子节点并获得整行的数据。
    6. 当辅助索引查询,从辅助索引树的根节点开始,直到叶子节点并获得主键的值,再到主键索引树中查找该主键的行数据。
  2. 在MyISAM的数据文件和索引文件是分开存储的。MyISAM使用B+树构建索引树时,叶子节点中存储的键值为索引列的值,数据为索引所在行的磁盘地址。
    1. 查找时,从主键索引树根节点开始,到叶子节点找到磁盘地址。在数据文件中找到对应的整行数据。
    2. 在 MyISAM 中,辅助索引和主键索引的结构是一样的,没有任何区别,叶子节点的数据存储的都是行记录的磁盘地址。只是主键索引的键值是唯一的,而辅助索引的键值可以重复。

5、什么是回表?

  1. 回表理解就是,当使用辅助索引中的主键值去主键索引树中查找行数的过程。
  2. 回表必然是会消耗性能影响性能。那如何避免呢?
    1. 使用索引覆盖:创建索引时,将所有的字段都设置为索引·。

      SELECT username, email FROM users WHERE username = 'john_doe'; 
      
      CREATE INDEX idx_username_email ON users (username, email);
      
    2. 使用联合索引:将当前多个单列索引创建为一个联合索引。比如联合索引(a_b_c),是不是等于有了索引:a,a_b,a_b_c三个索引,这样是不是节省了空间,

6、索引失效?

当查询过程中,数据库无法直接使用索引来进行查询,导致全表查询。性能下降。如何避免呢:

  1. 组合索引非最左前缀

描述:在组合索引中,如果查询条件没有从索引的最左边列开始,那么索引将不会被利用。
示例:对于索引(A, B, C),不从A 开始,查询WHERE B = ?或WHERE B = ? AND C = ?会导致索引失效。

  1. LIKE查询%开头
    描述:当LIKE查询的模式以%开头时,索引将不会被使用,因为数据库无法利用索引来快速定位记录。
    示例:查询SELECT * FROM table WHERE column LIKE '%abc’会导致索引失效。
  2. 字符串未加引号
    描述:如果查询条件中的字符串类型值没有用引号括起来,可能会因为类型不匹配导致隐式转换,从而使索引失效。
  3. 不等比较
    描述:对索引列使用不等比较(如!=或<>)时,索引的使用可能会受到限制,尽管它仍有助于缩小搜索范围。
  4. 索引列运算
    描述:在查询条件中对索引列进行函数运算或计算表达式时,索引将失效,因为数据库无法直接利用索引匹配处理后的值。
    示例:查询SELECT * FROM table WHERE YEAR(date_column) = 2023可能导致索引失效。
  5. OR连接查询
    描述:当查询条件使用OR连接时,如果OR连接的两个条件分别作用于不同的索引列,数据库可能无法同时利用这两个索引。
    示例:查询SELECT * FROM table WHERE column1 = ‘value1’ OR column2 = ‘value2’(假设column1和column2分别属于不同的索引)可能导致索引失效。
  6. 使用范围运算,not in,in > ,<都不行。

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

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

相关文章

【WRF模拟】如何得到更佳的WRF模拟效果?

【WRF模拟】如何得到更佳的WRF模拟效果&#xff1f; 模型配置&#xff08;The Model Configuration&#xff09;1.1 模拟区域domain设置1.2 分辨率Resolution (horizontal and vertical)案例&#xff1a;The Derecho of 29-30 June 2012 1.3 初始化和spin-up预热过程案例1-有无…

IOS safari 播放 mp4 遇到的坎儿

起因 事情的起因是调试 IOS 手机下播放服务器接口返回的 mp4 文件流失败。对于没调试过移动端和 Safari 的我来说着实费了些功夫&#xff0c;网上和AI也没有讲明白。好在最终大概理清楚了&#xff0c;在这里整理出来供有缘人参考。 问题 因为直接用 IOS 手机的浏览器打开页面…

单片机+人体红外感应的防盗系统设计(仿真+源码+PCB文件+报告)

资料下载地址&#xff1a;单片机人体红外感应的防盗系统设计(仿真源码PCB文件报告) 1、功能介绍 (1)该设计包括硬件和软件设计两个部分。 (2)本红外线防盗报警系统由热释电红外传感器、报警器、单片机控制电路、LED控制电路及相关的控制管理软件组成。用户终端完成信息采集、处…

网络攻防实践

1. 学习总结 黛蛇蠕虫案例&#xff1a; 原理&#xff1a;利用系统漏洞&#xff0c;并集成攻击代码。其中&#xff0c;通过蜜罐技术并进行数据分析所获取的攻击场景如下&#xff1a; 外部感染源攻陷蜜罐主机 执行Shellcode后获取主机权限后连接控制命令服务器&#xff0c;获取F…

寒假准备找实习复习java基础-day1

CMD常用命令&#xff1a; java跨平台原理&#xff1a; JRE和JVM Java基本数据类型

MacOS安装Xcode(非App Store)

文章目录 访问官网资源页面 访问官网资源页面 直接访问官网的历史版本下载资源页面地址&#xff1a;https://developer.apple.com/download/more/完成APP ID的登陆&#xff0c;直接找到需要的软件下载即可 解压后&#xff0c;安装将xcode.app移动到应用程序文件夹。

Docker 安装mysql ,redis,nacos

一、Mysql 一、Docker安装Mysql 1、启动Docker 启动&#xff1a;sudo systemctl start dockerservice docker start 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 2、查询mysql docker search mysql 3、安装mysql 3.1.默认拉取最新版…

gitlab克隆仓库报错fatal: unable to access ‘仓库地址xxxxxxxx‘

首次克隆仓库&#xff0c;失效了&#xff0c;上网查方法&#xff0c;都说是网络代理的问题&#xff0c;各种清理网络代理后都无效&#xff0c;去问同事&#xff1a; 先前都是直接复制的网页url当做远端url&#xff0c;或者点击按钮‘使用http克隆’ 这次对于我来说有效的远端u…

RK356x bsp 7 - PCF8563 RTC调试记录

文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…

图研院 | 掌握前沿图技术,从 “Graph XAI” 课程起航

在如今数字化转型加速的时代浪潮下&#xff0c; 图数据库技术正成为众多领域突破创新的关键力量&#xff01; 你是否也渴望深入了解其背后的核心知识&#xff0c; 开启自己的图技术进阶之旅&#xff1f; 由机工社精心打造的系列大师课&#xff0c; 特邀国际级专家/学者师资…

Oracle考试多少分算通过?

OCP和OCM认证的考试及格分数并不是固定的&#xff0c;而是根据考试的难度和考生的整体表现来确定。对于OCP认证&#xff0c;考生需要全面掌握考试要求的知识和技能&#xff0c;并在考试中表现出色才有可能通过。而对于OCM认证&#xff0c;考生则需要在每个模块中都达到一定的水…

01.HTTPS的实现原理-HTTPS的概念

01.HTTPS的实现原理-HTTPS的概念 简介1. HTTPS的概念和安全性2. HTTPS的实现原理3. HTTPS和HTTP的区别4. OSI七层协议模型5. SSL和TLS的区别 简介 该系列文章主要讲述了HTTPS协议与HTTP协议的区别&#xff0c;以及HTTPS如何实现安全传输。内容分为三部分&#xff1a;HTTPS的实…

教师管理系统

大概功能&#xff1a; 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名&#xff1a;必须是中文 手机号码&#xff1a;必须是11位&#xff0c;必须是数字 效果展示&#xff1a; 代码展示&#xff1a; Teache…

CSES-1687 Company Queries I(倍增法)

题目传送门https://vjudge.net/problem/CSES-1687#authorGPT_zh 解题思路 其实和倍增法求 LCA 是一样的…… 首先设 表示 号点的上面的第 个祖先是谁。 同倍增法&#xff1a; 然后&#xff0c;题目要求我们向上跳 个点。 枚举 &#xff08;从大到小&#xff0c;想想为…

自动驾驶控制算法-横向误差微分方程LQR前馈控制

本文是学习自动驾驶控制算法第六讲 前馈控制与航向误差以及前两节的学习笔记。 1 横向误差微分方程 以规划的轨迹作为自然坐标系&#xff0c;计算自车在轨迹上的投影点&#xff0c;进而计算误差&#xff1a; 如图所示&#xff0c;横向误差为 d d d&#xff0c;航向误差为 θ…

后端开发如何高效使用 Apifox?

Apifox 是一个 API 协作开发平台&#xff0c;后端、前端、测试都可以使用 Apifox 来提升团队的工作效率。对于后端开发者而言&#xff0c;Apifox 的核心功能主要包括四个模块&#xff1a;调用 API、定义 API、开发与调试 API 以及生成 API 文档。本文将详细介绍后端开发人员如何…

【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData

当需要获知组件是否被销毁时&#xff0c;ECS是没有回调告知的&#xff0c;因此可以将组件继承于ISystemStateComponentData接口&#xff0c;这样即使组件的实体被销毁了&#xff0c;该组件本身是不会消失的&#xff0c;所以可以通过在组件实体销毁后&#xff0c;去设置状态组件…

LeetCode 19:删除链表的倒数第N 个结点

题目&#xff1a; 地址&#xff1a;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 方法一&#xff1a; 方法二&#xff1a; 代码&#xff1a; package com.zy.leetcode.LeetCode_19;/*** Author: zy* Date: 2024-12-25-13:01* Description: 删除链表…

中学数学:一个函数值计算题

在数学的领域中&#xff0c;函数是一种描述变量之间关系的桥梁&#xff0c;它能够揭示出看似复杂现象背后的简洁规律。通过函数&#xff0c;我们可以预测、分析并解决实际问题。在这张图片中&#xff0c;我们看到了一位数学爱好者手写的解题过程&#xff0c;它展示了如何巧妙地…

kipotix4靶机实战

信息收集 1.判断靶机ip 原理&#xff1a;开靶机之前nmap扫一次网段&#xff0c;再开靶机之后扫一次&#xff0c;查看多出来的ip就是靶机ip ip192.168.98.1742.判断端口服务&#xff0c;系统版本 a.确定端口 b.-p指定端口进一步收集 c.信息筛选 1.端口&#xff1a;22,80,139,…