讲师中心 微信公众号
AI工具推荐 视频效率加速

mysql索引对写入性能有影响吗_mysql读写平衡分析

冬瑶君_8701

冬瑶君_8701

发布时间:2026-03-11 09:23:51

|

397人浏览过

|

来源于php中文网

原创

索引越多,INSERT/UPDATE/DELETE越慢,因每次写入需同步更新聚簇索引和所有二级索引,触发多次B+树操作;唯一索引因强制重复校验无法使用change_buffer,写入开销更大;批量导入时应临时删索引、调大缓冲参数;冗余索引是写入瓶颈主因,应优先清理而非加缓存。

mysql索引对写入性能有影响吗_mysql读写平衡分析

索引越多,INSERT/UPDATE/DELETE 越慢

MySQL 每次写入数据时,不仅要修改聚簇索引(主键 B+ 树),还要同步更新所有相关二级索引。每个二级索引都是一棵独立的 B+ 树,插入一条记录可能触发多次磁盘页分裂、节点调整和缓冲池刷脏。实测表明,一张表从 0 个索引增加到 5 个二级索引,INSERT 吞吐量可能下降 40%~70%,尤其在 innodb_buffer_pool_size 不足、磁盘 I/O 瓶颈明显时更甚。

常见错误现象:SHOW PROCESSLIST 中大量写操作卡在 updating 或 insert 状态;INFORMATION_SCHEMA.INNODB_METRICS 显示 dml_inserts 增长缓慢但 index_page_splits 激增。

  • 单条 INSERT 语句涉及 N 个索引 → 至少 N+1 次 B+ 树写入(含聚簇索引)
  • UPDATE 修改了索引列 → 原索引项删除 + 新索引项插入,开销翻倍
  • DELETE 同样需从所有索引中定位并移除对应条目,非主键删除更耗时

唯一索引和普通索引的写入代价差异很大

唯一索引(UNIQUE KEY)在写入前必须做重复值校验,而普通索引不需要。这个校验过程会强制走一次索引查找(即使使用 change buffer,也要先查唯一约束),导致事务持有行锁或间隙锁时间更长,容易引发锁等待甚至死锁。

使用场景:用户注册表的 email 字段加 UNIQUE,高并发写入时 INSERT ... ON DUPLICATE KEY UPDATE 可能因唯一检查阻塞其他线程。

  • 普通索引可被 change_buffer 缓存(innodb_change_buffering = inserts 默认开启),延迟合并到磁盘
  • 唯一索引无法使用 change_buffer 做插入缓存,必须实时查找校验
  • INSERT IGNORE 和 REPLACE INTO 同样触发唯一性检查,不比 ON DUPLICATE KEY UPDATE 更轻量

批量写入时索引维护策略要主动干预

默认情况下,MySQL 对每条 INSERT 都立即更新索引。但在大批量导入(如 ETL、日志归档)场景下,可以临时关闭非必要索引或调大缓冲参数来提速。

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载

实操建议:

  • 导入前用 ALTER TABLE t DROP INDEX idx_xxx 删除非关键二级索引,导入完成再重建(注意重建过程仍锁表)
  • 设置 SET SESSION sort_buffer_size = 268435456(256MB)提升 CREATE INDEX 效率
  • 对 LOAD DATA INFILE,确保 innodb_buffer_pool_size ≥ 数据总大小的 50%,否则频繁刷脏拖慢索引构建
  • 避免在 autocommit=1 下循环执行单条 INSERT,改用批量 INSERT INTO t VALUES (...), (...), (...)

读写失衡时优先砍冗余索引,而非盲目加缓存

很多团队遇到写入变慢第一反应是加 Redis 或调大 query_cache_size,但真正瓶颈常在索引设计本身。通过 pt-duplicate-key-checker 或 sys.schema_unused_indexes(MySQL 8.0+)可快速识别长期未被 SELECT 使用却持续拖累写入的索引。

容易被忽略的点:

  • 复合索引中前导列未被查询条件使用 → 整个索引对读无效,但写入照常维护
  • TEXT/JSON 列上的全文索引(FULLTEXT)写入开销远高于普通 B+ 索引,且无法用 change_buffer
  • 低基数列(如 status TINYINT 只有 0/1)建索引几乎不影响读性能,却白耗写资源

索引不是越多越好,而是越精准越省事。一个没被 EXPLAIN 用上的索引,就是纯写入税。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4743

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

971

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1249

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6761

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3483

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6740

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9321

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1270

2024.04.29

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 194人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn