MySQL 索引的作用、索引结构及执行流程介绍(索引篇 一)

索引介绍

MySQL索引(index)是一种用于加快数据库中数据搜索和查询的数据结构。它类似于书籍的目录,可以帮助数据库快速定位和访问特定数据,而无需扫描整个数据表。

索引的作用和缺点

  1. 加快数据搜索:通过使用索引,数据库可以快速定位到满足查询条件的数据行,提高数据检索的效率,降低数据库的IO成本

  2. 提高数据的排序性能 :索引可以按照特定的列进行排序,使得排序操作更加高效,降低

数据排序的成本,降低CPU的消耗。

缺点和限制

  1. 索引会占用额外的存储空间:索引需要额外的存储空间来存储索引数据结构,这可能会增加数据库的存储需求。

  2. 索引会增加数据插入、更新和删除的成本:每次对表进行插入、更新或删除操作时,索引也需要进行相应的维护操作,这可能会降低写操作的性能。

  3. 过多或不合理的索引可能会导致性能下降:如果创建了过多的索引或者索引的选择不合理,可能会导致查询性能下降。

四种索引结构

我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引(了解B+树结构:B+树结构

常见存储引擎的索引

索引(B+树)是如何将select请求优化查询的?

1. 创建索引:首先,我们需要在查询的列上创建B+树索引。通过创建索引,数据库会为该列构建一个B+树数据结构,用于快速定位到满足查询条件的数据行。

2. 解析查询语句:当执行select查询语句时,MySQL会首先对查询语句进行解析,确定查询的条件和需要检索的列。

3. 优化查询计划:接下来,MySQL会根据查询语句和现有的索引信息,优化查询计划。它会分析查询条件和可用的索引,决定如何使用索引来加速查询。优化器会评估不同的索引策略,并选择最佳的索引来执行查询(当前采用B+树)。

4. 定位到索引节点:在执行查询之前,MySQL会使用B+树索引结构进行索引查找。它会从根节点开始,根据查询条件的值与索引节点中的键值进行比较,决定是继续向左子节点还是右子节点查找。

5. 索引遍历:通过不断比较查询条件的值和索引节点中的键值,MySQL会按照B+树的结构逐级遍历索引,直到找到满足查询条件的叶子节点。如果查询条件是一个范围查询,MySQL会遍历索引中的多个节点。

6. 获取数据行:一旦找到满足查询条件的叶子节点,MySQL会从叶子节点中获取对应的数据行的物理位置。它使用这些物理位置信息来访问数据行,并返回给查询结果。

MySQL哪些列(字段)适合创建索引?

  1. 经常用于查询的字段

  2. 经常用于排序的字段:如果经常需要对某个字段进行排序,如按时间排序或价格排序,为该字段创建索引可以加快排序操作。

  3. 经常用于分组的字段:如果经常需要对某个字段进行分组,如按地区分组或按类别分组,为该字段创建索引可以提高分组查询的效率。

  4. 大数据范围的字段:对于具有大数据范围的字段,如日期范围或价格范围,为该字段创建索引可以快速定位到符合特定范围的数据。

  5. 高选择性的字段:选择性高的字段,即字段值不重复或重复较少,适合创建索引。这样可以提高索引的效果。

  6. 统计查询字段:如果需要进行统计查询,如计算平均值或总和,为相关字段创建索引可以加速这类查询。

下一篇:MySQL索引分类、聚集索引、二级索引、覆盖索引

相关推荐
Elastic 中国社区官方博客5 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪6 小时前
两次连接池泄露的BUG
java·数据库
南宫乘风7 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
TDengine (老段)8 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349848 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE8 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102169 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎9 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP9 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t9 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb