13.6其他架构评估方法-中间件
2026/4/10 11:13:09
“宽表必拆,大字段必 TEXT,字符集需精算” 是 MySQL 高性能表设计的三大黄金法则,直击行大小限制、存储效率、内存利用率的核心痛点。
utf8mb4下 VARCHAR 上限仅 16,383)| 场景 | 拆分方式 | 示例 |
|---|---|---|
| 冷热分离 | 高频访问字段 vs 低频大字段 | users(id, name) +user_profiles(bio, settings) |
| 功能解耦 | 核心属性 vs 扩展属性 | products(id, price) +product_specs(dimensions, material) |
| 生命周期分离 | 短期数据 vs 长期归档 | orders(active) +orders_archive |
SELECT *不再拖慢全表💡工程信号:
当表超过20 列或单行 >2KB,应评估拆分。
| 特性 | VARCHAR(N) | TEXT |
|---|---|---|
| 存储位置 | 行内(若 ≤ 768 字节) | 始终溢出(仅存 20B 指针) |
| 计入 65,535 限制 | ✅ 是 | ❌ 否 |
| 排序内存占用 | 全量加载到 sort buffer | 仅指针(需磁盘临时表) |
VARCHAR(20000)在utf8mb4下 = 80,000 字节 →建表失败TEXT→不计入限制,合法FULLTEXT索引⚠️陷阱:
ORDER BY text_column会强制使用磁盘临时表 → 改用生成列+索引
| 字符集 | 最大字节/字符 | VARCHAR(100) 实际上限 |
|---|---|---|
| latin1 | 1 | 100 字节 |
| utf8mb3 | 3 | 300 字节 |
| utf8mb4 | 4 | 400 字节 |
country_code CHAR(2))MAX_VARCHAR = FLOOR(65535 / 4) = 16,383INDEX idx_name (name(20))(避免索引过大)-- 危险:未精算字符集CREATETABLEt(aVARCHAR(20000)CHARACTERSETutf8mb4-- 20000*4=80,000 > 65,535 → 失败);-- 安全:精算后CREATETABLEt(aVARCHAR(16383)CHARACTERSETutf8mb4,-- 16383*4=65,532 < 65,535bTEXT-- 大字段走溢出);# my.cnf [client] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci innodb_large_prefix = ON # 允许大索引(MySQL 5.7)原始设计(反面教材):
CREATETABLEusers_bad(idBIGINT,usernameVARCHAR(50),emailVARCHAR(100),bioVARCHAR(5000)CHARACTERSETutf8mb4,-- 占 20,000 字节!settingsVARCHAR(10000)CHARACTERSETutf8mb4,-- 占 40,000 字节!created_atDATETIME);-- 总 ≈ 60,200 字节 → 接近 65,535 临界点优化后(三法则应用):
-- 1. 宽表拆分CREATETABLEusers(idBIGINTPRIMARYKEY,usernameVARCHAR(50),emailVARCHAR(100),created_atDATETIME)ROW_FORMAT=DYNAMIC;-- 2. 大字段用 TEXTCREATETABLEuser_profiles(user_idBIGINTPRIMARYKEY,bioTEXT,-- 不计入 65,535settings JSON-- 以 TEXT 存储)ROW_FORMAT=DYNAMIC;-- 3. 字符集精算-- username/email 用 utf8mb4(必需)-- 无浪费声明收益:
users表单行 ≈ 200 字节 → 每页存 75+ 行settings可存任意大小 JSON-- 查看表 Avg_row_lengthSELECTTABLE_NAME,AVG_ROW_LENGTHFROMinformation_schema.TABLESWHERETABLE_SCHEMA='your_db';-- 警告阈值:> 2000 字节需警惕-- 查看列实际字节上限SELECTCOLUMN_NAME,CHARACTER_MAXIMUM_LENGTH,CHARACTER_OCTET_LENGTH-- 关键:实际字节上限FROMinformation_schema.COLUMNSWHERETABLE_SCHEMA='your_db';SHOWCREATETABLEyour_table;-- 必须包含 ROW_FORMAT=DYNAMIC💡终极原则:
MySQL 的性能,不在 SQL 写得多优雅,而在表结构设计多克制。
遵循三法则,方能在海量数据下保持系统轻盈。