插件窝 干货文章 mysql 主键可以为 varchar

mysql 主键可以为 varchar

VARCHAR 使用 字符串 性能 61    来源:    2025-03-28

MySQL 主键使用 VARCHAR 类型的分析

是的,MySQL 中的主键(Primary Key)可以使用 VARCHAR 类型。虽然 INT 类型(特别是自增 INT)是最常见的主键选择,但 VARCHAR 作为主键在某些场景下也是完全可行的。

VARCHAR 主键的特点

  1. 允许使用:MySQL 明确支持将 VARCHAR 列设为主键
  2. 长度限制:InnoDB 引擎下,单列主键最大长度为 767 字节(utf8mb4 字符集下约 191 个字符)
  3. 性能考虑:相比 INT 类型,VARCHAR 主键在索引效率上会稍低

使用 VARCHAR 主键的场景

  1. 自然键:当数据本身有自然的字符串标识时(如用户名、产品编码、ISBN号等)
  2. UUID/GUID:使用字符串形式的全局唯一标识符
  3. 组合键:作为复合主键的一部分与其他列组合使用

性能优化建议

  1. 保持简短:尽量控制 VARCHAR 主键的长度
  2. 避免频繁更新:主键值更新会导致索引重建
  3. 考虑前缀索引:对于很长的字符串,可考虑只索引前N个字符
  4. 与自增INT比较
    • 插入性能:自增INT更优(顺序写入)
    • 查询性能:VARCHAR稍慢(比较字符串比整数更耗时)
    • 存储空间:VARCHAR通常占用更多空间

示例代码

-- 创建使用VARCHAR主键的表
CREATE TABLE users (
    username VARCHAR(50) PRIMARY KEY,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE
);

-- 或者使用UUID作为主键
CREATE TABLE documents (
    doc_id VARCHAR(36) PRIMARY KEY DEFAULT (UUID()),
    title VARCHAR(200) NOT NULL,
    content TEXT
);

总结来说,VARCHAR 作为主键在 MySQL 中是完全可行的,但需要根据具体业务场景权衡其优缺点。对于高并发写入或需要极致性能的场景,自增 INT 可能仍是更好的选择。