优化数据库 Column(列) 主要目标是 减少存储空间、提高查询性能、避免数据异常、方便维护。下面从 设计、类型、约束、索引、规范 等方面系统说明。
越小的列 → 更少 IO → 更快查询
| 场景 | 推荐 | 不推荐 |
|---|---|---|
| 状态 / 类型 | TINYINT |
INT |
| 年龄 | TINYINT UNSIGNED |
INT |
| 金额 | DECIMAL(10,2) |
FLOAT |
| 是否删除 | TINYINT(1) |
CHAR(1) |
| 时间戳 | TIMESTAMP / INT |
DATETIME(看场景) |
✅ 原则:够用就好,不要盲目用 BIGINT / VARCHAR(255)
-- 不好
name VARCHAR(50) NULL
-- 好
name VARCHAR(50) NOT NULL DEFAULT ''
原因:
-- 差
VARCHAR(255)
-- 好
VARCHAR(20) -- 手机号
VARCHAR(100) -- 邮箱
原因:
utf8mb4latin1 或 utf8mb4_general_ciname VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
❌ 不推荐
extra_info TEXT
✅ 推荐
address VARCHAR(200)
id_card VARCHAR(18)
❌
tags = "a,b,c"
✅
tag_id
或拆表(多对多)
status TINYINT COMMENT '0=禁用 1=启用'
优于
status ENUM('disabled','enabled')
原因:ENUM 扩展性差,修改代价高。
-- 好
INDEX idx_user_id (user_id)
-- 差
INDEX idx_desc (description) -- TEXT 列
CREATE INDEX idx_email ON user(email(50));
适用:
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
✅ 优点:
col1 VARCHAR(10),
col2 VARCHAR(10),
col3 VARCHAR(10),
...
col20 VARCHAR(10)
✅ 推荐
CREATE TABLE user (
id BIGINT,
name VARCHAR(255),
age INT,
status CHAR(1),
created_at DATETIME
);
CREATE TABLE user (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED,
status TINYINT NOT NULL DEFAULT 1,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
INDEX idx_status (status)
);
如果你愿意,我可以:
你可以直接贴表结构。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。