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

VARCHAR(50) vs VARCHAR(500):存储一样大,排序却慢了 3 倍

这是一个或许对你有用的社群 一对一交流/面试小册/简历优化/求职解惑欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料《项目实战视频》从书中学往事中“练”《互联网高频面试题》面朝简历学习春暖花开《架构 x 系统设计》摧枯拉朽掌控面试高频场景题《精进 Java 学习指南》系统学习互联网主流技术栈《必读 Java 源码专栏》知其然知其所以然这是一个或许对你有用的开源项目国产Star破10w的开源项目前端包括管理后台、微信小程序后端支持单体、微服务架构RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能多模块https://gitee.com/zhijiantianya/ruoyi-vue-pro微服务https://gitee.com/zhijiantianya/yudao-cloud视频教程https://doc.iocoder.cn【国内首批】支持 JDK17/21SpringBoot3、JDK8/11Spring Boot2双版本一个被忽视的设计规范能短就别长实验 1存储空间——确实没区别实验 2索引查询——也基本没区别实验 3全表 排序——差距 3 倍出来了真凶sort_buffer 内存预估按声明长度算决策矩阵常见字段该给多少长度4 个真实生产坑按踩到概率从高到低说到底一个被忽视的设计规范能短就别长很多团队的建表规范里都有这一条「对可变长度字段在满足业务的前提下尽可能使用较短的长度」但具体短多少为什么要短大部分人答不上来。最常见的「直觉式回答」是「VARCHAR(50)比VARCHAR(500)节省存储」—— 错。「短一点查得快」—— 对但只在特定 SQL 模式下成立。要回答清楚得做实验。下面这套实验从存储、索引查询、全表排序三个维度走一遍最后会发现90% 时间没区别但有一种 SQL 模式差距 3 倍以上——这才是规范要短的真正原因。基于 Spring Boot MyBatis Plus Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/ruoyi-vue-pro视频教程https://doc.iocoder.cn/video/实验 1存储空间——确实没区别建两张结构完全一样、只差name字段长度的表CREATE TABLE category_info_varchar_50 ( id BIGINT NOTNULL AUTO_INCREMENT, name VARCHAR(50) NOTNULL, is_show TINYINT(4) NOTNULLDEFAULT0, sort INT NOTNULLDEFAULT0, -- 其他业务字段省略 PRIMARY KEY (id), KEY idx_name (name) ) ENGINEInnoDBDEFAULTCHARSETutf8mb4; CREATETABLE category_info_varchar_500 ( id BIGINT NOTNULL AUTO_INCREMENT, name VARCHAR(500) NOTNULL, -- ... 其他字段同上 PRIMARY KEY (id), KEY idx_name (name) ) ENGINEInnoDBDEFAULTCHARSETutf8mb4;各灌 100 万条同样数据写入数据的存储过程略实际数据完全一致然后查information_schema.TABLESSELECT table_name AS 表名, table_rows AS 记录数, TRUNCATE(data_length / 1024 / 1024, 2) AS 数据(MB), TRUNCATE(index_length / 1024 / 1024, 2) AS 索引(MB) FROM information_schema.TABLES WHERE table_schema test_mysql_field;VARCHAR(50)表VARCHAR(500)表两张表的数据容量、索引容量完全相同——VARCHAR 是变长的实际存储看的是写入内容长度不是声明的最大长度。「存储空间不一样」的直觉第一关就废。基于 Spring Cloud Alibaba Gateway Nacos RocketMQ Vue Element 实现的后台管理系统 用户小程序支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能项目地址https://github.com/YunaiV/yudao-cloud视频教程https://doc.iocoder.cn/video/实验 2索引查询——也基本没区别走索引的等值查询、IN 查询、ORDER BY 索引列查询-- 等值 SELECTnameFROM category_info_varchar_50 WHEREname name100000; -- 0.012s SELECTnameFROM category_info_varchar_500 WHEREname name100000; -- 0.012s -- ORDER BY 走索引 SELECTnameFROM category_info_varchar_50 ORDERBYname; -- 0.370s SELECTnameFROM category_info_varchar_500 ORDERBYname; -- 0.379s -- IN 查询45 个值 SELECT * FROM category_info_varchar_50 WHEREnameIN (...); -- 0.011 ~ 0.014s SELECT * FROM category_info_varchar_500 WHEREnameIN (...); -- 0.012 ~ 0.014s走索引的 SQL 性能差距在 1ms 量级——可以认为没差。原因很简单InnoDB 在 DYNAMIC / COMPRESSED 行格式下索引 key 的单字段上限是 3072 字节——VARCHAR(500) utf8mb4满打满算 2000 字节完整能进索引查询走 BTree比较时按实际值长度来。索引这条路上 50 和 500 没毛病。仅在老的 REDUNDANT / COMPACT 行格式下索引 key 上限是 767 字节——这种情况下VARCHAR(500) utf8mb4才会被截断成 prefix 索引但MySQL 5.7 默认就是 DYNAMIC绝大多数项目不用担心。实验 3全表 排序——差距 3 倍出来了不走索引的全表扫描 排序差距瞬间出现无排序两张表表现一致加ORDER BY nameSELECT * FROM category_info_varchar_50 ORDER BY name; -- 1.498s SELECT * FROM category_info_varchar_500 ORDER BY name; -- 4.875sVARCHAR(50) 全表排序耗时VARCHAR(500) 全表排序耗时VARCHAR(500)慢了 3.25 倍。一个看着无所谓的字段长度选择在排序场景下变成了真问题。真凶sort_buffer 内存预估按声明长度算为什么会差这么多看 SQL 执行 profile。VARCHAR(50)的 profile——86% 时间在数据传输Sending data关注两个状态变量Created_tmp_files和sort_merge_passesCreated_tmp_files 3sort_merge_passes 95VARCHAR(500)的 profile——多了「临时表排序」环节Created_tmp_files 4sort_merge_passes 645—— 比 50 的版本暴涨 6.8 倍sort_merge_passes是 MySQL 归并排序的次数——越大说明sort_buffer塞不下越要靠磁盘临时文件归并磁盘 IO 上来性能就崩。关键来了MySQL 在做排序前会根据字段声明的最大长度估算每条记录在sort_buffer里的占位——VARCHAR(500)单条估到 500 字节 元数据开销VARCHAR(50)估到 50 字节。同样 8MB 的sort_buffer_size字段长度估算单条装得下行数100 万行需要归并次数VARCHAR(50)~58 字节~144,000~7 轮VARCHAR(500)~558 字节~15,000~67 轮实际数据明明都是name123456这种十几字节的字符串但 MySQL 不看这个——它只看声明长度。这就是规范让你「能短就短」的真正动机在排序、分组、临时表场景下声明长度直接决定内存利用率。决策矩阵常见字段该给多少长度不是越短越好太短了改起来更痛苦。给个参考字段类型推荐长度理由用户名 / 昵称VARCHAR(64)主流业务 32-50 够用留点余量邮箱VARCHAR(128)RFC 5321 上限 254但实际 128手机号CHAR(20)定长且固定CHAR 比 VARCHAR 更适合URLVARCHAR(512)或VARCHAR(1024)长 URL 现实存在但避免 VARCHAR(2000)标题 / 名称VARCHAR(128)业务分类、文章标题、商品名都够描述 / 富文本TEXT一旦超过 1KB 用 TEXT别拿 VARCHAR(8000) 死撑UUID / 雪花 IDCHAR(36)/BIGINT定长用 CHAR雪花用 BIGINT极不确定的开放字段JSON或拆出独立表别用 VARCHAR(N) 当万能桶为什么不无脑用 VARCHAR(255)历史遗留——MySQL 5.0.3 之前 VARCHAR 上限是 255 字节模板默认 255。现在 InnoDB 上 VARCHAR 最长 65535 字节但越长在排序场景代价越大。4 个真实生产坑按踩到概率从高到低坑 1分页查询带排序TP99 突然劣化最常见ORDER BY name LIMIT 100, 10看起来很轻——前端列表分页谁不写但只要 ORDER BY 字段没走索引、且字段是 VARCHAR(500)sort_buffer 直接爆。监控里 TP99 飙升、慢查询日志炸出一堆Using filesort; Using temporary。修法要么给 ORDER BY 字段加索引要么把字段长度收紧要么调大sort_buffer_size但调大全实例都受影响要慎重。坑 2临时表 GROUP BY 拼字段常见SELECT category, COUNT(*) FROM ... GROUP BY category;GROUP BY 也走 sort_buffer 或临时表逻辑同 ORDER BY。长 VARCHAR 字段做 GROUP BY 同样吃亏。坑 3UNION 把多张表的字段长度并起来少见但破坏力大SELECT name FROM table_a -- VARCHAR(50) UNION SELECT name FROM table_b; -- VARCHAR(500)UNION 结果集字段长度按最大的那个算——本来 50 就够UNION 一接结果集里全按 500 估。复杂报表 SQL 把多个表的字段拼起来性能突然崩就是这种问题。坑 4JSON字段当 VARCHAR 用高级场景「业务字段不确定先放 JSON」——三年后字段平均 5KB涉及它的查询、排序、临时表全炸。JSON 比 VARCHAR(N) 对 sort_buffer 更不友好。该拆表必须拆别拿 JSON 顶。说到底VARCHAR(50)和VARCHAR(500)在存储、走索引的查询上没区别——这条规范的真正意义在 sort_buffer 上。好的字段长度设计不是「能存就行」是「让 MySQL 在排序时不被声明长度欺骗到磁盘上」。欢迎加入我的知识星球全面提升技术能力。 加入方式“长按”或“扫描”下方二维码噢星球的内容包括项目实战、面试招聘、源码解析、学习路线。文章有帮助的话在看转发吧。 谢谢支持哟 (*^__^*

相关文章:

VARCHAR(50) vs VARCHAR(500):存储一样大,排序却慢了 3 倍

👉 这是一个或许对你有用的社群🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 《项目实战(视频)》:从书中学,往事中…...

NumPy 2.4.6 快速版发布:修复 2.4.5 回归问题,支持 Python 3.11 - 3.14

NumPy 2.4.6 快速版本现已发布,修复了 2.4.5 版本中的回归问题,支持 Python 3.11 - 3.14 版本,本次共合并 4 个拉取请求。版本发布背景 在 NumPy 2.4.5 版本使用过程中发现了回归问题,为了及时解决这些问题,开发团队迅…...

YOLOv8实时目标检测与自适应控制技术在游戏辅助系统中的应用研究

YOLOv8实时目标检测与自适应控制技术在游戏辅助系统中的应用研究 【免费下载链接】RookieAI_yolov8 基于yolov8实现的AI自瞄项目 AI self-aiming project based on yolov8 项目地址: https://gitcode.com/gh_mirrors/ro/RookieAI_yolov8 技术挑战剖析:实时游…...

不熬夜、不焦虑、不踩坑:用百考通AI 无痛搞定本科毕业论文

它不替你思考,但能帮你扫清写作路上 80% 的障碍 又到一年毕业季,凌晨三点的宿舍里,总有一盏灯还亮着。电脑屏幕上是只写了标题的 Word 文档,旁边散落着被退回三次的开题报告,知网页面开了十几个标签却找不到想要的方向…...

约瑟夫环问题C语言实现详解:从数组模拟到链表优化,新手避坑指南

约瑟夫环问题C语言实现详解:从数组模拟到链表优化,新手避坑指南 约瑟夫环问题是一个经典的算法挑战,它模拟了一个古老的历史场景:一群人围成一圈,按照特定规则逐个淘汰成员,直到最后一人幸存。对于C语言初学…...

YOLACT实战:在Windows 10/11上用RTX 3060显卡跑通实例分割(含CUDA 11.7配置)

YOLACT实战:在Windows 10/11上用RTX 3060显卡跑通实例分割(含CUDA 11.7配置) 当RTX 3060遇上实例分割,如何在Windows平台上避开那些深坑?去年用YOLACT完成工业质检项目时,发现大多数教程都假设用户使用Linu…...

为团队 CLI 工具统一配置 Taotoken 作为后端模型服务

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为团队 CLI 工具统一配置 Taotoken 作为后端模型服务 当团队开发的内部命令行工具需要集成大模型能力时,直接对接多个厂…...

美业门店商业模式开发(系统介绍)

美业门店商业模式开发美业门店的商业模式开发需要考虑多个方面,包括目标客户群体、服务类型、定价策略、营销渠道和盈利模式。常见的商业模式包括单店经营、连锁加盟、线上预约结合线下服务、会员制等。单店经营适合初创品牌,成本较低,管理简…...

CS188 Note3 学习笔记

更好的阅读体验 Informed Search(启发式搜索) 原文解释 If we have some notion of the direction in which we should focus our search, we can significantly improve performance and “hone in” on a goal much more quickly. This is exactly the focus of informed …...

深度解析XGBoost环境配置:从零构建高性能梯度提升库

深度解析XGBoost环境配置:从零构建高性能梯度提升库 【免费下载链接】xgboost Scalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoop, Spark, Dask, Flink…...

VAP特效动画:跨平台高性能动画播放的终极解决方案

VAP特效动画:跨平台高性能动画播放的终极解决方案 【免费下载链接】vap VAP是企鹅电竞开发,用于播放特效动画的实现方案。具有高压缩率、硬件解码等优点。同时支持 iOS,Android,Web 平台。 项目地址: https://gitcode.com/gh_mirrors/va/vap VAP&…...

终极微信小程序逆向解析指南:wxappUnpacker专业实战解析

终极微信小程序逆向解析指南:wxappUnpacker专业实战解析 【免费下载链接】wxappUnpacker forked from https://github.com/qwerty472123/wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 微信小程序逆向解析是开发者深入理解小…...

Unity Figma Bridge:设计-开发一体化协同的技术架构解决方案

Unity Figma Bridge:设计-开发一体化协同的技术架构解决方案 【免费下载链接】UnityFigmaBridge Easily bring your Figma Documents, Components, Assets and Prototypes to Unity 项目地址: https://gitcode.com/gh_mirrors/un/UnityFigmaBridge Unity Fig…...

四旋翼无人机深度强化学习控制框架与实战优化

1. 四旋翼无人机端到端深度强化学习框架解析四旋翼无人机的自主飞行控制一直是机器人学领域的核心挑战。传统PID控制虽然稳定可靠,但在复杂动态环境中表现受限。深度强化学习(DRL)通过模拟环境交互实现智能决策,为无人机控制带来了…...

90%的人只用了Superpowers 10%的能力,实战案例带你走通全流程

装了Superpowers还是不会用?这套完整工作流,让你的AI从“工具”变“搭档”你可能已经在 GitHub 上给 Superpowers 点过 Star 了,甚至在本地环境里跑了一遍安装流程。但说实话,你大概率只触发了其中一两个 Skill——写代码时偶尔触…...

OPPO Pad 6 官宣!3K 柔光屏,5 月 25 日发布

5月18日,OPPO 正式官宣全新平板 OPPO Pad 6,定档 5月25日与 Reno16 系列同台发布。作为迭代款,它没有激进改款,而是在成熟设计上精准升级 —— 核心芯片、屏幕、续航、存储与手写体验全面优化,瞄准学生网课、大屏娱乐、…...

软件开发开源日报

📌 今日概览今日软件开发开源领域呈现多元化发展态势,各大科技公司持续推进AI基础设施、云原生平台和开发者工具的开源进程。字节跳动DeerFlow 2.0成为社区焦点,腾讯混元Hy3开源引发行业热议,华为openEuler发布超节点OS重大更新。…...

告警爆炸,根因定位困难?用DevOps Agent帮你自动查!

随着企业在亚马逊云科技上的工作负载日益复杂——Amazon EC2集群、Amazon RDS数据库、Amazon ECS/EKS容器、Amazon Lambda函数、网络与负载均衡等多种服务交织运行——运维团队面临严峻挑战:告警爆炸:Amazon CloudWatch、第三方监控(Datadog、…...

用 Articraft 制作可动 3D 资产

如果你想做一个“能开合的台灯、能转动的风扇、能拉开的抽屉柜”,传统 3D 工作流通常意味着:建模、拆分部件、定义关节、反复调试、再导出到下游系统。 问题是,这类“可动对象”并不只是静态几何体,它们还需要语义化部件、合理结构…...

对比官方渠道Taotoken在Token计费与套餐上的成本优势感知

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比官方渠道Taotoken在Token计费与套餐上的成本优势感知 对于个人开发者和初创团队而言,在探索和集成大模型能力时&am…...

答辩前一天才慌?paperxie 帮我把毕业论文 PPT 的 “地狱副本” 打成了 “新手教程”

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ppt/createhttps://www.paperxie.cn/ppt/create 距离本科毕业论文答辩只剩 3 天,我对着空白的 PPT 页面,第 10 次删掉了刚写好的标题。 导师说我的内…...

为GitHub开源项目配置统一的大模型调用与成本管控方案

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为GitHub开源项目配置统一的大模型调用与成本管控方案 对于开源项目的维护者而言,为项目集成AI能力正变得越来越普遍。…...

给程序员和数据分析师的气象学入门:搞懂城市边界层,让你的天气API数据不再‘失真’

给程序员和数据分析师的气象学入门:搞懂城市边界层,让你的天气API数据不再‘失真’ 当你在调用天气API时,是否遇到过这样的困惑:明明获取的是同一个城市的温度数据,为什么市中心的气温总比郊区高出几度?为什…...

全志T3工业级评估板深度评测:国产化、接口性能与Docker容器化实践

1. 开箱初探:一份诚意满满的工业级“全家桶”作为一名在嵌入式硬件开发领域摸爬滚打了十多年的老工程师,我经手过的评估板、开发板少说也有上百款。从早期的ARM9到现在的多核A系列、RISC-V,每次开箱都像是一次探险。但这次拿到创龙科技&#…...

Cadence Allegro焊盘设计避坑指南:从SMD到通孔,这些层设置错了板子就废了

Cadence Allegro焊盘设计避坑指南:从SMD到通孔的关键层设置解析 当一块PCB板从设计文件变成实体电路板时,最令人崩溃的莫过于发现焊盘设计不当导致整批产品无法使用。作为使用Cadence Allegro进行PCB设计的工程师,Padstack Editor中的每个参数…...

手把手教你用Wireshark和VirtualBox日志诊断eNSP错误代码40(保姆级排错流程)

从日志分析到网络诊断:eNSP错误代码40的深度排错指南 当eNSP模拟器弹出"错误代码40"的红色警告时,大多数用户的第一反应是寻找快速解决方案。但真正的网络工程师会告诉你,这个数字背后隐藏着虚拟网络世界的完整故事。本文将带您穿…...

YimMenu完全指南:如何在GTA5中构建你的个人安全增强系统

YimMenu完全指南:如何在GTA5中构建你的个人安全增强系统 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/Yi…...

别再只升级Nginx了!修复CVE-2022-41741漏洞,你的OpenSSL 1.0.2k可能也是“猪队友”

深度解析Nginx与OpenSSL的漏洞协同效应:从CVE-2022-41741看系统级安全升级策略 当安全扫描报告提示Nginx存在CVE-2022-41741等高危漏洞时,许多运维团队的第一反应是立即升级Nginx到最新版本。然而在实际企业环境中,我们经常遇到这样的困境&am…...

VK视频下载终极指南:3种方法轻松保存珍贵回忆

VK视频下载终极指南:3种方法轻松保存珍贵回忆 【免费下载链接】VK-Video-Downloader Скачивайте видео с сайта ВКонтакте в желаемом качестве 项目地址: https://gitcode.com/gh_mirrors/vk/VK-Video-Downloade…...

通过curl命令快速测试Taotoken接口连通性与返回格式

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过curl命令快速测试Taotoken接口连通性与返回格式 在集成大模型服务时,直接使用curl命令进行接口测试是一种高效、轻…...