在 MySQL 中建索引时需要注意哪些事项?

news/2024/12/14 22:51:23/文章来源:https://www.cnblogs.com/eiffelzero/p/18607380

在 MySQL 中建索引时需要注意哪些事项

索引在 MySQL 中是提升查询性能的关键,但不当的索引设计可能会导致性能下降或资源浪费。因此,在建索引时需要综合考虑性能、存储成本和业务需求。


1. 确定需要建索引的列

  • 主键和唯一性约束字段

    • 主键列会自动创建聚簇索引。
    • 对需要唯一性约束的字段添加唯一索引(UNIQUE),如用户名、邮箱。
  • 频繁作为查询条件的列

    • WHEREGROUP BYORDER BYHAVINGDISTINCT 等子句中频繁出现的字段建索引。
  • 数据分布较离散的字段

    • 选择性高(离散值多)的列更适合作为索引,能有效减少扫描数据量。
    • 例如:身份证号 适合建索引,性别(男/女)不适合。

2. 控制索引数量

  • 避免过多索引

    • 每个索引都会增加存储空间,并在 INSERTUPDATEDELETE 操作时产生额外的维护开销。
    • 索引过多可能会导致写性能下降。
  • 删除冗余索引

    • 避免重复索引,如同时创建 (a)(a, b) 索引时,单列索引可能冗余。

3. 选择合适的索引类型

  • 单列索引和联合索引

    • 单列索引适用于简单查询。
    • 联合索引(多列)适用于多条件查询,但需注意最左前缀匹配原则。
  • 覆盖索引

    • 尽量设计覆盖查询字段的索引,避免回表操作,提高查询效率。
  • 全文索引

    • 对于文本内容(如文章、评论)中的关键词搜索,使用全文索引(FULLTEXT)。
  • 空间索引

    • 对于地理信息查询,使用 SPATIAL 索引。

4. 考虑索引的存储成本

  • 字段类型选择

    • 字段尽量选择较小的数据类型(如 INTBIGINT 更节省空间)。
    • 对长文本字段(如 VARCHARTEXT)建索引时需设置合适的前缀长度。
  • 合适的前缀索引

    • 对大字段(如 VARCHAR(255)),可以使用前缀索引:
      CREATE INDEX idx_email ON users(email(10));
    • 前缀长度需根据数据分布选择,避免索引选择性过低。

5. 索引设计与查询匹配

  • 遵循最左前缀原则

    • 联合索引从最左列开始连续匹配,才能有效利用。
  • 避免索引失效的操作

    • 不要对索引列使用函数或表达式:
      错误示例:WHERE YEAR(create_time) = 2023
    • 避免在索引列上进行隐式类型转换:
      错误示例:WHERE age = '25'ageINT 类型)
  • 考虑排序需求

    • ORDER BYGROUP BY 的字段顺序应与索引设计一致,避免文件排序。

6. 根据业务需求动态调整

  • 分析慢查询日志

    • 定期分析 slow query log,找到需要优化的查询,根据实际查询需求设计索引。
  • 使用 EXPLAIN 分析查询

    • 通过 EXPLAIN 查看查询是否正确使用了索引,并根据实际执行计划调整索引。

7. 其他注意事项

  • 避免盲目全表索引

    • 并不是每一列都需要索引,对频繁更新且很少用于查询的列不建议建索引。
  • 分区和索引的兼容性

    • 在分区表中,必须包含分区键的字段才能使用索引。
  • 锁问题

    • 在大表上创建或删除索引时,可能导致锁表操作。建议在业务低峰期执行,或使用 ONLINE 创建索引功能。

8. 总结

建索引是性能优化的核心,但需要综合考虑查询效率、存储成本和写性能影响。通过结合业务需求、数据分布和查询模式,合理设计索引策略,才能最大化发挥索引的作用。

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

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

相关文章

PolarCTF-Pwn(困难)WP

1、ret2libc 前期准备:int __fastcall main(int argc, const char **argv, const char **envp) {char s[112]; // [rsp+0h] [rbp-70h] BYREFsetvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stderr, 0LL, 2, 0LL);gets(s);puts(s);return 0; }因为程序是动…

游戏产业加速鸿蒙化步伐:超1800款鸿蒙原生游戏已上架

2024年度中国游戏产业年会于12月12日至13日北京市首钢国际会展中心举办,华为终端云全球生态发展与销售部副总裁张思建受邀出席主论坛,并发表了主题演讲。同期,由华为游戏中心主办的鸿蒙游戏行业论坛也在北京石景山区举行,本次活动邀请了中国音像与数字出版协会常务副理事长…

最强分类器调优秘诀!AdaBoost让性能飙升!

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。 各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。…

Toyota Programming Contest 2024#12(AtCoder Beginner Contest 384)题解

总体情况感觉这次在起飞。 20 分钟后就在罚坐。 A - aaaadaa 题目描述 给定一个长度为 \(N\) 的字符串 \(S\) ,由小写英文字母以及小写英文字母 \(c_1\) 和 \(c_2\) 组成。 查找将 \(S\) 中所有不属于 \(c_1\) 的字符替换为 \(c_2\) 后得到的字符串。 思路分析 直接模拟。代码…

解决2024.1以后新版本IDEA Lombok (@Data)等不生效的问题

做项目做着做着新模块用不了 lombok 真的要崩溃了,各种检查插件、配置,发现都无法恢复;乱试指定版本:终于可用了。。真的有崩溃感

DNS之公共DNS

阿里 AliDNS 阿里公共DNS是阿里巴巴集团推出的DNS递归解析系统,目标是成为国内互联网基础设施的组成部分,面向互联网用户提供“快速”、“稳定”、“智能”的免费DNS递归解析服务。 DNS 服务器 IP 地址: 首选:223.5.5.5 备选:223.6.6.6 阿里公共DNS114DNS 国内用户量巨大的…

NestJS 部署Apache

要将Nest.JS应用搭建在Apache服务器上,你需要了解Nest.JS是一个基于Node.js的框架,因此它本质上是一个后端服务,而Apache通常用作前端服务器或反向代理。以下是将Nest.JS应用与Apache服务器结合使用的步骤: 一、准备环境安装Node.js:确保在服务器上安装了Node.js。你可以从…

综合设计——多源异构数据采集与融合应用综合实践

这个项目属于哪个课程2024数据采集与融合技术实践 组名 从你的全世界爬过团队logo:项目简介 项目名称:博物识植项目logo:项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,…

maven docker-maven-plugin 发布docker 20241214

1、docker开启远程访问 端口 2375docker主机:192.168.177.128 vi /usr/lib/systemd/system/docker.service #修改ExecStart这行 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 #重新加载配置文件 [root@localhost ~]# systemctl daemon-reload #重启服务 [root@lo…

10大关键技术解构:智能合同审查系统全景解析

前言 随着企业数字化转型的深入,合同管理在业务流程中的重要性愈加凸显。传统的人工审查合同方式不仅耗时耗力,还容易出现疏漏,尤其在复杂法律条款和跨部门协作的场景中,这一问题尤为明显。为了解决这一痛点,思通数科智能合同审查系统应运而生。基于人工智能和大数据分析的…