MySQL 的索引类型有哪些?

MySQL 中的索引是提高查询性能的重要工具,它通过构建数据结构来加速数据检索。MySQL 支持多种索引类型,每种类型适用于不同的场景。以下是 MySQL 中主要的索引类型及其特点:


1. B-Tree 索引(默认类型)

  • 结构:基于平衡多路搜索树(B-Tree),适用于等值查询(=)、范围查询(><BETWEEN)、排序(ORDER BY)和分组(GROUP BY)。
  • 特点
    • 叶子节点存储数据或主键值(InnoDB 的聚簇索引直接存储数据,非聚簇索引存储主键值)。
    • 支持前缀匹配(如 LIKE 'abc%'),但 LIKE '%abc' 无法利用索引。
    • 适用于多列组合索引(遵循最左前缀原则)。
  • 适用场景:全值匹配、范围查询、排序、分组。
  • 示例
    CREATE INDEX idx_name ON users(name);  -- 单列索引
    CREATE INDEX idx_name_age ON users(name, age);  -- 组合索引
    

2. Hash 索引

  • 结构:基于哈希表,仅支持等值查询(=IN),不支持范围查询或排序。
  • 特点
    • 查询效率高(O(1) 时间复杂度),但仅适用于内存表(如 MEMORY 引擎)或特定场景(如 InnoDB 的自适应哈希索引)。
    • 无法避免全表扫描(哈希冲突时需遍历链表)。
  • 适用场景:等值查询(如缓存场景)。
  • 示例
    CREATE TABLE hash_table (id INT,name VARCHAR(100),INDEX USING HASH (name)  -- MEMORY 引擎支持
    ) ENGINE=MEMORY;
    

3. Full-Text 索引(全文索引)

  • 结构:专为文本搜索设计,支持对 CHARVARCHARTEXT 列进行全文检索。
  • 特点
    • 使用倒排索引技术,支持自然语言搜索(MATCH ... AGAINST)、布尔模式搜索等。
    • 仅适用于 MyISAMInnoDB(MySQL 5.6+)。
  • 适用场景:文本内容搜索(如博客文章、商品描述)。
  • 示例
    CREATE FULLTEXT INDEX idx_content ON articles(content);
    SELECT * FROM articles WHERE MATCH(content) AGAINST('MySQL 索引');
    

4. R-Tree 索引(空间索引)

  • 结构:基于多维空间数据(如地理坐标),支持空间数据查询(如 MBRContainsST_Distance)。
  • 特点
    • 仅适用于 MyISAMInnoDB(MySQL 5.7+)。
    • 用于地理信息系统(GIS)或空间数据分析。
  • 适用场景:地理位置查询(如附近商家、区域范围搜索)。
  • 示例
    CREATE SPATIAL INDEX idx_location ON stores(location);  -- location 为 GEOMETRY 类型
    SELECT * FROM stores WHERE MBRContains(GeomFromText('POLYGON(...)'), location);
    

5. 前缀索引(Partial Index)

  • 结构:对字符串列的前 N 个字符创建索引,节省存储空间。
  • 特点
    • 适用于长字符串(如 URL、邮箱),但可能降低选择性(重复值增多)。
    • 需合理选择前缀长度(通过 COUNT(DISTINCT LEFT(col, N)) 评估)。
  • 适用场景:长字符串列的等值查询。
  • 示例
    CREATE INDEX idx_email_prefix ON users(email(10));  -- 对 email 前 10 个字符建索引
    

6. 唯一索引(Unique Index)

  • 结构:强制列值唯一(允许 NULL,但 NULL 值不重复)。
  • 特点
    • 保证数据唯一性,同时可作为普通索引加速查询。
    • 适用于主键(PRIMARY KEY)或唯一约束(UNIQUE KEY)。
  • 适用场景:需要唯一性的字段(如用户名、身份证号)。
  • 示例
    CREATE UNIQUE INDEX idx_username ON users(username);
    -- 或直接定义唯一约束
    ALTER TABLE users ADD CONSTRAINT uk_email UNIQUE (email);
    

7. 主键索引(Primary Key Index)

  • 结构:特殊的唯一索引,不允许 NULL 值,且每张表只能有一个。
  • 特点
    • 在 InnoDB 中,主键索引是聚簇索引(数据按主键顺序存储)。
    • 用于标识行数据,是表的核心索引。
  • 适用场景:表的唯一标识符(如自增 ID、UUID)。
  • 示例
    CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100)
    );
    

8. 复合索引(Multi-Column Index)

  • 结构:在多列上创建的索引,遵循最左前缀原则。
  • 特点
    • 查询需从索引的最左列开始匹配(如 (a,b,c) 索引可加速 aa,ba,b,c 的查询)。
    • 避免“索引失效”问题(如跳过最左列或使用范围查询后无法利用后续列)。
  • 适用场景:多列联合查询(如姓名+年龄筛选)。
  • 示例
    CREATE INDEX idx_name_age ON users(name, age);
    -- 有效查询:
    SELECT * FROM users WHERE name = 'Alice' AND age = 25;
    -- 无效查询(跳过最左列):
    SELECT * FROM users WHERE age = 25;
    

9. 自适应哈希索引(Adaptive Hash Index, AHI)

  • 结构:InnoDB 自动为频繁访问的索引页构建哈希索引,无需手动创建。
  • 特点
    • 仅在内存中维护,适用于等值查询(如 =IN)。
    • 无法手动控制,由 InnoDB 引擎自动管理。
  • 适用场景:高并发等值查询的热点数据。

10. 函数索引(虚拟列索引)

  • 结构:对计算列(如 LOWER(name))创建索引,避免在查询中重复计算。
  • 特点
    • 需 MySQL 5.7+ 或 MariaDB 支持。
    • 适用于表达式查询(如不区分大小写的搜索)。
  • 示例
    ALTER TABLE users ADD COLUMN name_lower VARCHAR(100) AS (LOWER(name)) STORED;
    CREATE INDEX idx_name_lower ON users(name_lower);
    SELECT * FROM users WHERE name_lower = 'alice';
    

索引选择建议

  1. 优先选择 B-Tree 索引:适用于大多数场景(等值、范围、排序)。
  2. 避免过度索引:每个索引会增加写入开销(INSERT/UPDATE/DELETE)。
  3. 利用最左前缀原则:设计复合索引时,将高选择性列放在左侧。
  4. 监控索引使用情况:通过 EXPLAIN 分析查询计划,删除未使用的索引。

总结

索引类型适用场景引擎支持示例
B-Tree全值、范围、排序、分组MyISAM、InnoDBCREATE INDEX idx ON t(col);
Hash等值查询(内存表)MEMORY、InnoDB(AHI)INDEX USING HASH (col)
Full-Text文本搜索MyISAM、InnoDBCREATE FULLTEXT INDEX ...
R-Tree空间数据查询MyISAM、InnoDBCREATE SPATIAL INDEX ...
前缀索引长字符串列的等值查询MyISAM、InnoDBINDEX (col(10))
唯一索引唯一性约束所有引擎CREATE UNIQUE INDEX ...
主键索引表的唯一标识符所有引擎PRIMARY KEY (col)
复合索引多列联合查询MyISAM、InnoDBINDEX (a, b, c)

根据实际查询需求选择合适的索引类型,并通过 EXPLAIN 验证优化效果。

我正在程序员刷题神器面试鸭上高效准备面试,9000+ 高频面试真题、800 万字优质题解,覆盖主流编程方向,跟我一起刷原题、过面试:点击进入

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

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

相关文章

基于Qt5的蓝牙打印开发实战:从扫描到小票打印的全流程

文章目录 前言一、应用案例演示二、开发环境搭建2.1 硬件准备2.2 软件配置 三、蓝牙通信原理剖析3.1 实现原理3.2 通信流程3.3 流程详解3.4 关键技术点 四、Qt蓝牙核心类深度解析4.1 QBluetoothDeviceDiscoveryAgent4.2 QBluetoothDeviceInfo4.3 QBluetoothSocket 五、功能实现…

高可靠性厚铜板制造的关键设备与工艺投入

随着科技的不断发展&#xff0c;电子设备越来越普及&#xff0c;对电路板的需求也越来越大。厚铜板电路板作为一种高性能、高可靠性的电路板&#xff0c;受到了广泛的关注和应用。那么&#xff0c;作为一家厚铜板电路板供应商&#xff0c;如何投入线路板生产呢&#xff1f;本文…

【如何使用solidwork编辑结构导入到simscope】

这里写自定义目录标题 尝试将solidrwork的模型导入到matlab中&#xff0c;以下是官方给出的设计步骤&#xff0c;冲啊 To use Simscape Multibody Link, you must install MATLAB and the CAD applications on the same computer. To ensure the successful installation of Si…

Linux 在个人家目录下添加环境变量 如FLINK_PROPERTIES=“jobmanager.rpc.address: jobmanager“

问题&#xff1a; Docker Flink Application Mode 命令行形式部署前&#xff0c;需要在Linux执行以下&#xff1a; $ FLINK_PROPERTIES"jobmanager.rpc.address: jobmanager" $ docker network create flink-network 临时变量只在当前session会话窗口生效&#xf…

spring项目rabbitmq es项目启动命令

应该很多开发者遇到过需要启动中间件的情况&#xff0c;什么测试服务器挂了&#xff0c;服务连不上nacos了巴拉巴拉的&#xff0c;虽然是测试环境&#xff0c;但也会手忙脚乱&#xff0c;疯狂百度。 这里介绍一些实用方法 有各种不同的场景&#xff0c;一是重启&#xff0c;服…

语音合成之七语音克隆技术突破:从VALL-E到SparkTTS,如何解决音色保真与清晰度的矛盾?

从VALL-E到SparkTTS&#xff0c;如何解决音色保真与清晰度的矛盾&#xff1f; 引言语音克隆技术发展史YourTTS&#xff1a;深入剖析架构与技术VALL-E&#xff1a;揭秘神经编解码语言模型MaskGCTSparkTTS&#xff1a;利用 LLM 实现高效且可控的语音合成特征解耦生成式模型特征解…

run code执行ts配置

1、全局安装typescript npm install –g typescript 执行tsc –v&#xff0c;可输出版本号&#xff0c;代表安装成功 2、创建tsConfig文件 npx tsc –init 创建成功目录下会出现tsconfig.json文件 3、安装ts-node&#xff0c;支持执行运行ts文件 npm install –g ts-node 控制…

splitchunk(如何将指定文件从主包拆分为单独的js文件)

1. 说明 webpack打包会默认将入口文件引入依赖js打包为一个入口文件&#xff0c;导致这个文件会比较大&#xff0c;页面首次加载时造成加载时间较长 可通过splitchunk配置相应的规则&#xff0c;对匹配的规则打包为单独的js,减小入口js的体积 2. 示例 通过正则匹配&#xff…

postgres 导出导入(基于数据库,模式,表)

在 PostgreSQL 中&#xff0c;导出和导入数据库、模式&#xff08;schema&#xff09;或表的数据可以使用多种工具和方法。以下是常用的命令和步骤&#xff0c;分别介绍如何导出和导入整个数据库、特定的模式以及单个表的数据。 一、导出数据 1. 使用 pg_dump 导出整个数据库…

第十一天 主菜单/设置界面 过场动画(Timeline) 成就系统(Steam/本地) 多语言支持

前言 对于刚接触Unity的新手开发者来说&#xff0c;构建完整的游戏系统往往充满挑战。本文将手把手教你实现游戏开发中最常见的四大核心系统&#xff1a;主菜单界面、过场动画、成就系统和多语言支持。每个模块都将结合完整代码示例&#xff0c;使用Unity 2022 LTS版本进行演示…

深入探索Python Pandas:解锁数据分析的无限可能

放在前头 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 在当今数据驱动的时代&#xff0c;高效且准确地处理和分析数据成为了各个领域的关键需求。而Python作为一门强大且灵活的编程语言&#xff0c;…

小集合 VS 大集合:MySQL 去重计数性能优化

小集合 VS 大集合&#xff1a;MySQL 去重计数性能优化 前言一、场景与问题 &#x1f50e;二、通俗执行流程对比三、MySQL 执行计划解析 &#x1f4ca;四、性能瓶颈深度剖析 &#x1f50d;五、终极优化方案 &#x1f3c6;六、总结 前言 &#x1f4c8; 测试结果&#xff1a; 在…

3、Linux操作系统下,linux的技术手册使用(man)

linux系统内置技术手册&#xff0c;方便开发人员查阅Linux相关指令&#xff0c;提升开发效率 man即是manual的前三个字母&#xff0c;有时候遇事不决&#xff0c;问个人&#xff08;man&#xff09; 其在线网址为&#xff1a;man 还有man网站的作者写的书&#xff0c;可以下…

京东商品详情数据爬取难度分析与解决方案

在当今数字化商业时代&#xff0c;电商数据对于市场分析、竞品研究、价格监控等诸多领域有着不可估量的价值。京东&#xff0c;作为国内首屈一指的电商巨头&#xff0c;其商品详情页蕴含着海量且极具价值的数据&#xff0c;涵盖商品价格、库存、规格、用户评价等关键信息。然而…

正确应对监管部门的数据安全审查

首席数据官高鹏律师团队编著 在当今数字化时代&#xff0c;数据安全已成为企业及各类组织面临的重要议题&#xff0c;而监管部门的数据安全审查更是关乎其生存与发展的关键挑战。随着法律法规的不断完善与监管力度的加强&#xff0c;如何妥善应对这一审查&#xff0c;避免潜在…

三星One UI安全漏洞:剪贴板数据明文存储且永不过期

三星One UI系统曝出重大安全漏洞&#xff0c;通过剪贴板功能导致数百万用户的敏感信息面临泄露风险。 剪贴板数据永久存储 安全研究人员发现&#xff0c;运行Android 9及以上系统的三星设备会将所有剪贴板内容——包括密码、银行账户详情和个人消息——以明文形式永久存储&am…

动态规划求解leetcode300.最长递增子序列(LIS)详解

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1&#…

Rule.resourceQuery(通过路径参数指定loader匹配规则)

1. 说明 在 webpack 4 中&#xff0c;Rule.resourceQuery 是一个用于根据文件路径中的 查询参数&#xff08;query string&#xff09; 来匹配资源的配置项。它允许你针对带有特定查询条件的文件&#xff08;如 file.css?inline 或 image.png?raw&#xff09;应用不同的加载…

快速上手 MetaGPT

1. MetaGPT 简介 在当下的大模型应用开发领域&#xff0c;Agent 无疑是最炙手可热的方向&#xff0c;这也直接催生出了众多的 Agent 开发框架。在这之中&#xff0c; MetaGPT 是成熟度最高、使用最广泛的开发框架之一。 MetaGPT 是一款备受瞩目的多智能体开发框架&#xff0c…

新闻数据接口开发指南:从多源聚合到NLP摘要生成

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;新闻行业也迎来了新的变革。AI不仅能够自动化生成新闻内容&#xff0c;还能通过智能推荐系统为用户提供个性化的新闻体验。万维易源提供的“新闻查询”API接口&#xff0c;结合了最新的AI技术&#xff0c;为开…