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

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

在 MySQL 中建立索引是优化查询性能的重要手段,但不当的索引设计可能导致资源浪费、性能下降甚至拖慢写入速度。

所以我们我们首先要判断对于一个字段或者一些字段要不要建立索引。

适合建立索引的字段通常是:

  1. 主键字段:MySQL 会自动为主键创建索引

  2. 频繁作为查询条件的字段:WHERE(减少全表扫描的开销,从而提高查询性能)、JOIN(加快表之间的连接速度)、ORDER BY(直接利用索引的有序性进行排序,提高排序性能)、GROUP BY(帮助数据库快速将数据分组) 中频繁出现的列

  3. 选择性高的字段:对于选择性高的字段,索引可以更有效地过滤数据,减少需要扫描的记录数。

    选择性是指列中不同值的数量与总行数的比例。选择性高的字段意味着不同值的数量较多,重复值较少。

所以相对的,不适合建立索引的字段通常是:

  1. 字段的值有大量重复的,比如性别字段

  2. 长字段,为这种字段建立索引会占用大量空间,如长字符串(如 VARCHAR(255)

  3. 组成联合索引的其中一个索引不适合再创建,如已存在联合索引 (A, B),单独为 A 建索引就是冗余的。要避免冗余索引

然后,如果我们要创建索引的话,就要选择合适的索引类型

  • 主键索引(Primary Key):必须唯一且非空,InnoDB 会以主键构建聚簇索引(数据按主键顺序存储)。

  • 唯一索引(Unique Index):确保列值唯一,适用于唯一性约束(如邮箱、身份证号)。实现一人一单。

  • 普通索引(Non-unique Index):加速查询,但允许重复值。

  • 联合索引(Composite Index):多个列组合的索引,如果多个条件经常一起查询,可以考虑联合索引,减少索引数量。联合索引需注意最左前缀原则(查询条件必须包含联合索引的最左列)。

  • 全文索引(Full-text Index):适用于文本字段的模糊搜索(如 LIKE '%keyword%'),但性能有限,可以结合 Elasticsearch 等专用工具。

  • 空间索引(Spatial Index):用于地理空间数据(如 GEOMETRY 类型)。

但是,索引也有一定的代价

  • 写入性能下降:每次 INSERT/UPDATE/DELETE 需要维护索引,索引越多,写操作越慢。所以我们要控制索引的数量。虽然索引加速查询,但写操作会变慢,需要权衡读写比例。比如在写频繁的表上,索引不宜过多

  • 占用磁盘和内存:索引需要存储空间,尤其是长字段的索引。

http://www.xdnf.cn/news/3771.html

相关文章:

  • Vue3源码学习5-不使用 `const enum` 的原因
  • 普推知产:图形商标通过初审,图形商标申请时注意!
  • 【深度学习】典型的 CNN 网络
  • Linux第20节 --- inode和文件系统
  • qsort函数的用法
  • MySQL 日期加减函数详解
  • 61常用控件_QDateTimeEdit的使用
  • 用Maven定位和解决依赖冲突
  • 研究主题:聊天机器人使用与情感纽带的形成
  • 归并排序【逆序对】
  • 【AI面试准备】数据驱动测试思维与实践指南
  • 使用Node.js搭建https服务器
  • 《Windows 环境下 Qt C++ 项目升级 GCC 版本的完整指南》
  • 如何在WORD WPS中输入英语音标 批量给英语标注音标
  • 【堆】最大堆、最小堆以及GO语言的实现
  • Redis从入门到实战实战篇2
  • 智能家居的OneNet云平台
  • Linux进程间通信(二)之管道1【匿名管道】
  • 【2025软考高级架构师】——数据库系统(10)
  • SpringBoot上传文件到阿里云OSS对象存储
  • 数据赋能(211)——质量管理——数据可验证性原则
  • 【Mytais系列】介绍、核心概念
  • 【浅学】Windows下ffmpeg+nginx+flv将本地视频推流在本地搭建的Web前端页面中播放,超详细步骤
  • C++ 抽象工厂模式详解
  • [Vue]编程式导航
  • C++ 单例模式详解
  • React18组件通信与插槽
  • 数模竞赛的坑,你踩了几个?
  • 源码编译Qt StateMachine
  • 如何在 CentOS 7 命令行连接 Wi-Fi?如何在 Linux 命令行连接 Wi-Fi?