MySQL索引详解
前言
在数据库管理中,索引是提高数据检索速度的重要工具。MySQL作为流行的关系型数据库管理系统,提供了多种类型的索引来优化查询性能。本文将深入探讨MySQL索引的工作原理、类型、创建方法以及最佳实践。
索引简介
MySQL中的索引是一种数据库对象,它用于加快数据库表中数据的检索速度。索引类似于书籍的目录,它允许数据库管理系统(DBMS)快速找到存储在表中的数据,而无需扫描整个表。
索引的作用
-
快速查找与 WHERE 子句匹配的行。
-
排除考虑的行。如果可以在多个索引之间进行选择,MySQL 通常使用找到行数最少的索引(最有选择性的索引)。
-
如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行。例如,如果您在 (col1, col2, col3) 上有一个三列索引,则您具有 (col1)、(col1, col2) 和 (col1, col2, col3) 上的索引搜索功能。有关更多信息,请参见第 10.3.6 节“多列索引”。
-
执行连接时从其他表中检索行。如果将列声明为相同的类型和大小,MySQL 可以更有效地使用列上的索引。在这种情况下,如果将 VARCHAR 和 CHAR 声明为相同的大小,则它们被视为相同。例如,VARCHAR(10) 和 CHAR(10) 大小相同,但 VARCHAR(10) 和 CHAR(15) 大小不同。
-
对于非二进制字符串列之间的比较,两个列应使用相同的字符集。例如,将 utf8mb4 列与 latin1 列进行比较会阻止使用索引。
-
如果无法在不进行转换的情况下直接比较值,则比较不同的列(例如,将字符串列与时间或数字列进行比较)可能会阻止使用索引。对于数字列中的给定值(例如 1),它可能与字符串列中的任意数量的值(例如“1”、“1”、“00001”或“01.e1”)相等。这排除了对字符串列使用任何索引的可能性。
-
查找特定索引列 key_col 的 MIN() 或 MAX() 值。这是由预处理器优化的,该预处理器检查您是否在索引中 key_col 之前出现的所有关键部分上使用 WHERE key_part_N = constant。在这种情况下,MySQL 为每个 MIN() 或 MAX() 表达式执行单个键查找并将其替换为常量。如果所有表达式都替换为常量,则查询将立即返回。例如:
SELECT MIN(key_part2),MAX(key_part2)
FROM tbl_name WHERE key_part1=10;
-
如果对可用索引的最左前缀进行排序或分组(例如,ORDER BY key_part1, key_part2),则对表进行排序或分组。如果所有关键部分都后跟 DESC,则按相反顺序读取键。 (或者,如果索引是降序索引,则按正向顺序读取键。)请参见第 10.2.1.16 节“ORDER BY 优化”、第 10.2.1.17 节“GROUP BY 优化”和第 10.3.13 节“降序索引”。
-
在某些情况下,可以优化查询以检索值而无需查阅数据行。(为查询提供所有必要结果的索引称为覆盖索引。)如果查询仅使用表中包含在某些索引中的列,则可以从索引树中检索所选值以提高速度:
SELECT key_part3 FROM tbl_name
WHERE key_part1=1
索引的工作原理
索引类似于书籍的目录,它允许数据库快速定位数据行,而无需扫描整个表。索引可以加快数据的检索速度,但也会增加写操作的开销,因为索引本身也需要维护。
当数据库执行查询操作时,它会检查查询条件,如果这些条件与索引列匹配,数据库引擎可以使用索引来快速定位数据。索引通过减少需要检查的数据量来加速查询,这就像通过目录快速找到书中的特定章节,而不是一页一页地翻阅。
索引的数据结构
B-树(Balanced Tree)
B-树是一种自平衡的树数据结构,它能够保持数据有序,同时允许搜索、顺序访问、插入和删除操作。B-树的特点包括:
节点结构:每个节点包含多个键和对应的指针(指向子节点)。
键的顺序:节点中的键按照顺序排列,每个指针对应一个范围。
搜索效率:由于树的平衡特性,搜索操作可以在对数时间内完成。
数据存储:B-树的节点中存储了键和数据,或者键和数据的指针。
B+树(Balanced Plus Tree)
B+树是B-树的变种,它在数据库和文件系统中被广泛使用。B+树的特点包括:
节点结构:B+树的内部节点只存储键和指向子节点的指针,不存储数据。数据只存储在叶子节点中。
叶子节点:所有的叶子节点通过指针连接起来,形成了一个有序的数据链表,便于范围查询。
查询性能:由于数据都存储在叶子节点,且叶子节点形成了有序链表,所以B+树在进行范围查询时非常高效。
空间效率:B+树的内部节点可以存储更多的键,使得树的高度更低,减少了磁盘I/O操作。
为什么选择B+树作为数据库索引
范围查询:B+树的叶子节点形成了一个有序链表,非常适合执行范围查询,如SELECT * FROM table WHERE key BETWEEN a AND b。
磁盘I/O:B+树由于可以存储更多的键,树的高度较低,减少了磁盘I/O次数,提高了查询效率。
写操作:B+树的写操作(插入、删除)对树的平衡影响较小,因为它只在叶子节点进行。
缓存效率:数据库系统通常使用内存缓存索引,B+树的结构使得缓存可以存储更多的索引信息,提高了缓存利用率。
图解B-树和B+树
以下是B-树和B+树的图解,展示了它们的结构差异:
B-树:
节点1/ \节点2 节点3/ \ / \
键值1 键值2 键值3 键值4
B+树:
节点1/ \节点2 节点3/ \ / \
键值1 键值2 键值3 键值4| |
叶子节点1 叶子节点2| |数据1 数据2| |数据3 数据4
在B+树中,所有的数据都存储在叶子节点,并且叶子节点之间形成了一个有序链表。
索引的类型
- B+Tree索引
特点:默认的索引类型,适用于全键值查找、范围查找和排序操作。
应用:是最常用的索引类型,适合多种查询场景。 - 哈希索引
特点:提供快速的等值查询,但不支持范围查询。
应用:适用于等值查询操作,如精确匹配。 - 空间索引(R-Tree)
特点:用于地理空间数据类型,支持空间数据的快速检索。
应用:适用于地理信息系统(GIS)和地图应用程序。 - 全文索引
特点:支持复杂查询,如模糊匹配和多字段搜索。
应用:适用于文本搜索和搜索引擎。 - 组合索引
特点:在多个列上创建索引,提高查询效率。
应用:适用于多列查询条件的查询优化。
创建索引
创建索引可以通过以下几种方式:
使用CREATE INDEX语句
CREATE INDEX index_name ON table_name (column1, column2);
使用ALTER TABLE语句
ALTER TABLE table_name ADD INDEX (column);
在创建表时指定索引
CREATE TABLE table_name (column1 INT,column2 VARCHAR(255),INDEX (column1),INDEX (column2)
);
索引的最佳实践
-
选择正确的索引类型
根据查询需求和数据特性选择合适的索引类型。 -
避免过度索引
索引虽然能提高查询速度,但过多索引会增加写操作的开销和存储空间。 -
定期维护索引
使用ANALYZE TABLE或OPTIMIZE TABLE命令定期维护索引,以保持其性能。 -
使用索引扫描分析
利用EXPLAIN命令分析查询计划,确保查询能够利用索引。 -
考虑索引覆盖
尽可能设计索引以覆盖查询中使用的列,减少数据访问次数。
总结
索引是MySQL中优化数据检索的关键工具。理解不同类型的索引及其适用场景,合理创建和维护索引,可以显著提高数据库的性能。通过本文的介绍,你应该能够更好地利用MySQL索引来优化你的数据库查询。
附录
MySQL官方文档:MySQL Indexes
索引维护工具:MySQL Performance Tuning
good day!!!
相关文章:
MySQL索引详解
前言 在数据库管理中,索引是提高数据检索速度的重要工具。MySQL作为流行的关系型数据库管理系统,提供了多种类型的索引来优化查询性能。本文将深入探讨MySQL索引的工作原理、类型、创建方法以及最佳实践。 索引简介 MySQL中的索引是一种数据库对象&am…...
fastadmin 根据选择数据来传参给selectpage输入框
文章目录 js代码php代码:完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…...
【算法】堆与优先级队列
【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)最后一块石头的重量 .1- 题目解析 .2- 代码编写 2)数据流中的第 K 大元素 .1- 题目解析 .2- 代码编写 3)前K个高频单词 .1- 题目解析 .2- 代码编写 4…...
Java基础尚硅谷85-面向对象特征一:封装性
曾国藩说,基础不牢,很难走得远。 所以时时回顾一下Java基础,打好地基,让自己走得更稳,更远。 今天这节课,学到对自己有点价值的东西是: 为什么要封装?保护数据安全。只对外暴露极少…...
828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问
一、Flexus云服务器X实例简介 1.1 概述 华为云Flexus X实例是华为云推出的一款创新云服务器产品,它主要面向中小企业和开发者,旨在解决传统云服务中的痛点,提供更加灵活、高效的云服务体验。 华为深刻洞察了中小企业和开发者在云服务应用中遇…...
828华为云征文|华为云Flexus云服务器X实例部署Xnote笔记应用
828华为云征文|华为云Flexus云服务器X实例部署Xnote笔记应用 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Note Mark 介绍2.1 Xnote简介2.2 Xnote特点2.3 主要使用场景 三、本次实…...
手写数字识别案例分析(torch,深度学习入门)
在人工智能和机器学习的广阔领域中,手写数字识别是一个经典的入门级问题,它不仅能够帮助我们理解深度学习的基本原理,还能作为实践编程和模型训练的良好起点。本文将带您踏上手写数字识别的深度学习之旅,从数据集介绍、模型构建到…...
应用密码学第一次作业(9.23)
一、Please briefly describe the objectives of information and network security,such as confidentiality, integrity, availability , authenticity , and accountability The objectives of information and network security include: Confidentiality: Protecting se…...
JSON合并工具
JSON合并工具 1. 项目概述 本项目旨在开发一个强大而灵活的JSON合并工具,能够合并多个JSON文件,处理复杂的嵌套结构,提供详细的合并报告,并实现全面的验证和错误处理机制。 2. 功能需求 2.1 基本合并功能 支持合并两个或多个…...
【网络编程】网页的显示过程
文章目录 1.URL 解析2.DNS 解析3.TCP三次握手4.服务器接收请求5.客户端接收响应 首先我们知道网页经过网络总共有应用层,传输层,网络层,数据链路层,物理层 1.URL 解析 将获得的网址解析出协议,主机名,域名…...
用nginx-rtmp-win32-master及ffmpeg模拟rtmp视频流
效果 使用nginx-rtmp-win32-master搭建RTMP服务 双击exe就可以了。切记整个目录不能有中文 README.md ,启用后本地的RTM路径: rtmp://192.168.1.186/live/xxx ffmpeg将地本地视频推RMTP F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -c c…...
使用python-pptx将PPT转换为图片:将每张幻灯片保存为单独的图片文件
哈喽,大家好,我是木头左! 本文将详细介绍如何使用python-pptx将PPT的每一张幻灯片保存为单独的图片文件。 安装python-pptx库 需要确保已经安装了python-pptx库。可以通过以下命令使用pip进行安装: pip install python-pptx导入所需库 接下来,需要导入一些必要的库,包…...
聊聊企业的低代码实践背景与成效
数字化转型的道路充满挑战是大家的普遍共识,许多企业仍未完全步入数字化的行列,它们面临的是系统的碎片化和操作的复杂性。在数字优先的今天,企业要想维持竞争力,比任何时期都更需要实施某种程度的数字化升级。如果一个组织难以提…...
zookeeper面试题
1. 什么是zookeeper zookeeper是一个开源的 分布式协调服务。他是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。 Zooke…...
Linux学习笔记13---GPIO 中断实验
中断系统是一个处理器重要的组成部分,中断系统极大的提高了 CPU 的执行效率,本章会将 I.MX6U 的一个 IO 作为输入中断,借此来讲解如何对 I.MX6U 的中断系统进行编程。 GIC 控制器简介 1、GIC 控制器总览 I.MX6U(Cortex-A)的中断控制器…...
[Redis][Hash]详细讲解
目录 0.前言1.常见命令1.HSET2.HGET3.HEXISTS4.HDEL5.HKEYS6.HVALS7.HGETALL8.HMGET9.HLEN10.HSETNX11.HINCRBY12.HINCRBYFLOAT 2.内部编码1.ziplist(压缩链表)2.hashtable(哈希表) 3.使用场景4.缓存方式对比1.原⽣字符串类型2.序列化字符串类型3.哈希类型 0.前言 在Redis中&am…...
上半年亏损扩大/百亿资产重组终止,路畅科技如何“脱困”?
在智能网联汽车市场形势一片大好的前提下,路畅科技上半年的营收却出现了下滑,并且亏损也进一步扩大。 2024年半年度报告显示,路畅科技营业收入1.35亿元,同比下滑7.83%;实现归属上市公司股东的净利润为亏损2491.99万元…...
协议IP规定,576字节和1500字节的区别
576字节和1500字节的区别主要在于它们是IP数据报在数据链路层中的最大传输单元(MTU)的不同限制。 576字节:这个数值通常与IP层(网络层)的数据报有关,它指的是在不进行分片的情况下,IP数据…...
对抗攻击的详细解析:原理、方法与挑战
对抗攻击的详细解析:原理、方法与挑战 对抗攻击(Adversarial Attack)是现代机器学习模型,尤其是深度学习模型中的一个关键安全问题。其本质在于,通过对输入数据添加精微的扰动,人类难以察觉这些扰动&#…...
Python办公自动化教程(003):PDF的加密
【1】代码 from PyPDF2 import PdfReader, PdfWriter# 读取PDF文件 pdf_reader PdfReader(./file/Python教程_1.pdf) pdf_writer PdfWriter()# 对第1页进行加密 page pdf_reader.pages[0]pdf_writer.add_page(page) # 设置密码 pdf_writer.encrypt(3535)with open(./file/P…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
