当前位置: 首页 > news >正文

MySQL索引详解

前言

在数据库管理中,索引是提高数据检索速度的重要工具。MySQL作为流行的关系型数据库管理系统,提供了多种类型的索引来优化查询性能。本文将深入探讨MySQL索引的工作原理、类型、创建方法以及最佳实践。

索引简介

MySQL中的索引是一种数据库对象,它用于加快数据库表中数据的检索速度。索引类似于书籍的目录,它允许数据库管理系统(DBMS)快速找到存储在表中的数据,而无需扫描整个表。

索引的作用

  1. 快速查找与 WHERE 子句匹配的行。

  2. 排除考虑的行。如果可以在多个索引之间进行选择,MySQL 通常使用找到行数最少的索引(最有选择性的索引)。

  3. 如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行。例如,如果您在 (col1, col2, col3) 上有一个三列索引,则您具有 (col1)、(col1, col2) 和 (col1, col2, col3) 上的索引搜索功能。有关更多信息,请参见第 10.3.6 节“多列索引”。

  4. 执行连接时从其他表中检索行。如果将列声明为相同的类型和大小,MySQL 可以更有效地使用列上的索引。在这种情况下,如果将 VARCHAR 和 CHAR 声明为相同的大小,则它们被视为相同。例如,VARCHAR(10) 和 CHAR(10) 大小相同,但 VARCHAR(10) 和 CHAR(15) 大小不同。

  5. 对于非二进制字符串列之间的比较,两个列应使用相同的字符集。例如,将 utf8mb4 列与 latin1 列进行比较会阻止使用索引。

  6. 如果无法在不进行转换的情况下直接比较值,则比较不同的列(例如,将字符串列与时间或数字列进行比较)可能会阻止使用索引。对于数字列中的给定值(例如 1),它可能与字符串列中的任意数量的值(例如“1”、“1”、“00001”或“01.e1”)相等。这排除了对字符串列使用任何索引的可能性。

  7. 查找特定索引列 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;
  1. 如果对可用索引的最左前缀进行排序或分组(例如,ORDER BY key_part1, key_part2),则对表进行排序或分组。如果所有关键部分都后跟 DESC,则按相反顺序读取键。 (或者,如果索引是降序索引,则按正向顺序读取键。)请参见第 10.2.1.16 节“ORDER BY 优化”、第 10.2.1.17 节“GROUP BY 优化”和第 10.3.13 节“降序索引”。

  2. 在某些情况下,可以优化查询以检索值而无需查阅数据行。(为查询提供所有必要结果的索引称为覆盖索引。)如果查询仅使用表中包含在某些索引中的列,则可以从索引树中检索所选值以提高速度:

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+树中,所有的数据都存储在叶子节点,并且叶子节点之间形成了一个有序链表。

索引的类型

  1. B+Tree索引
    特点:默认的索引类型,适用于全键值查找、范围查找和排序操作。
    应用:是最常用的索引类型,适合多种查询场景。
  2. 哈希索引
    特点:提供快速的等值查询,但不支持范围查询。
    应用:适用于等值查询操作,如精确匹配。
  3. 空间索引(R-Tree)
    特点:用于地理空间数据类型,支持空间数据的快速检索。
    应用:适用于地理信息系统(GIS)和地图应用程序。
  4. 全文索引
    特点:支持复杂查询,如模糊匹配和多字段搜索。
    应用:适用于文本搜索和搜索引擎。
  5. 组合索引
    特点:在多个列上创建索引,提高查询效率。
    应用:适用于多列查询条件的查询优化。

创建索引

创建索引可以通过以下几种方式:

使用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)
);

索引的最佳实践

  1. 选择正确的索引类型
    根据查询需求和数据特性选择合适的索引类型。

  2. 避免过度索引
    索引虽然能提高查询速度,但过多索引会增加写操作的开销和存储空间。

  3. 定期维护索引
    使用ANALYZE TABLE或OPTIMIZE TABLE命令定期维护索引,以保持其性能。

  4. 使用索引扫描分析
    利用EXPLAIN命令分析查询计划,确保查询能够利用索引。

  5. 考虑索引覆盖
    尽可能设计索引以覆盖查询中使用的列,减少数据访问次数。

总结

索引是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&#xf…...

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…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Java 加密常用的各种算法及其选择

在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块&#xff0…...

二维FDTD算法仿真

二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...