本文来自微信公众号

继续回答星球水友提问:

沈老师,我听网上说,MySQL数据表,在数据量比较大的情况下,主键不宜过长,是不是这样呢?这又是为什么呢?

这个问题嘛,不能一概而论:

(1)如果是InnoDB存储引擎,主键不宜过长;

(2)如果是MyISAM存储引擎,影响不大;

先举个简单的栗子说明一下前序知识。

假设有数据表:

t(id PK, name KEY, sex, flag);

其中:

(1)id是主键;

(2)name建了普通索引;

假设表中有四条记录:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

如果存储引擎是MyISAM,其索引与记录的结构是这样的:

(1)有单独的区域存储记录(record);

(2)主键索引与普通索引结构相同,都存储记录的指针(暂且理解为指针);

画外音:

(1)主键索引与记录不存储在一起,因此它是非聚集索引(Unclustered Index);

(2)MyISAM可以没有PK;

MyISAM使用索引进行检索时,会先从索引树定位到记录指针,再通过记录指针定位到具体的记录。

画外音:不管主键索引,还普通索引,过程相同。

InnoDB则不同,其索引与记录的结构是这样的:

(1)主键索引与记录存储在一起;

(2)普通索引存储主键(这下不是指针了);

画外音:

(1)主键索引与记录存储在一起,所以才叫聚集索引(Clustered Index);

(2)InnoDB一定会有聚集索引;

InnoDB通过主键索引查询时,能够直接定位到行记录。

但如果通过普通索引查询时,会先查询出主键,再从主键索引上二次遍历索引树。

回归正题,为什么InnoDB的主键不宜过长呢?

假设有一个用户中心场景,包含身份证号,身份证MD5,姓名,出生年月等业务属性,这些属性上均有查询需求。

最容易想到的设计方式是:

身份证作为主键

其他属性上建立索引

user(id_code PK,

id_md5(index),

name(index),

birthday(index));

此时的索引树与行记录结构如上:

id_code聚集索引,关联行记录

其他索引,存储id_code属性值

身份证号id_code是一个比较长的字符串,每个索引都存储这个值,在数据量大,内存珍贵的情况下,MySQL有限的缓冲区,存储的索引与数据会减少,磁盘IO的概率会增加。

画外音:同时,索引占用的磁盘空间也会增加。

此时,应该新增一个无业务含义的id自增列:

以id自增列为聚集索引,关联行记录

其他索引,存储id值

user(id PK auto inc,

id_code(index),

id_md5(index),

name(index),

birthday(index));

如此一来,有限的缓冲区,能够缓冲更多的索引与行数据,磁盘IO的频率会降低,整体性能会增加。

总结

(1)MyISAM的索引与数据分开存储,索引叶子存储指针,主键索引与普通索引无太大区别;

(2)InnoDB的聚集索引和数据行统一存储,聚集索引存储数据行本身,普通索引存储主键;

(3)InnoDB不建议使用太长字段作为PK(此时可以加入一个自增键PK),MyISAM则无所谓;

希望解答了这位水友的疑问。

mysql键太长_数据库,主键为何不宜太长长长长长长长长?(转)相关推荐

  1. mysql复合主键的区别_联合主键和复合主键区别

    什么是数据表的复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成 比如 create table test ( name varchar(19), id number, value va ...

  2. jwt token 太长_养三角梅,枝条太长怎么办

    为你提供最新家居产品资讯,传递最新家居设计理念!家,我们的 三角梅又名叶子花,花瓣是三角形的,有单瓣的重瓣的,都挺漂亮的,三角梅虽然可以长成灌木状,但是它也会爬藤,因为它是一种半藤本的爬藤植物,在养三 ...

  3. mysql 联合主键重复数据库_联合主键和复合主键有什么区别

    联合主键和复合主键有什么区别 发布时间:2020-07-11 09:52:20 来源:亿速云 阅读:171 作者:Leah 这期内容当中小编将会给大家带来有关联合主键和复合主键有什么区别,文章内容丰富 ...

  4. mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键

    多表外键下将普通的id主键更新为uuid主键 2019-05-20 02:45:37 来源: 晴天小雨 0 摘要:在多表外键影响和保证数据不删除的前提下,借助Flask-sqlalchemy插件及SQ ...

  5. mysql数据库 主键

    mysql数据库 主键 键值 设置自增长 主键(primary key)又称主码,用于唯一标识表中的每一条记录 可以定义表中的一列或多列为主键,主键列上不能有相同的两行值,也不能为空值. 定义auth ...

  6. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析...

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  7. mysql主键索引需要创建_mysql主键还需要建立索引吗?

    mysql主键不需要建立索引,主键具备索引的功能:当创建或设置主键的时候,mysql会自动添加一个与主键对应的唯一索引,不需要再做额外的添加.数据库管理系统对于主键会自动生成唯一索引,所以主键是一个特 ...

  8. mysql主键是非空吗_mysql主键非空约束怎么设置?

    mysql主键约束 主键(PRIMARY KEY)的完整称呼是"主键约束",是 MySQL 中使用最为频繁的约束.一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中 ...

  9. MySQL之深入解析自增主键为何不连续

    一.前言 众所周知,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,大量的随机 IO,自增主键不连续.这应该是大家已经熟知的知识点,但是也应该还有不少的朋友不知道为何自增主键不是严格递 ...

最新文章

  1. logistic回归 如何_第七章:利用Python实现Logistic回归分类模型
  2. windows server 2012 application control policy
  3. 压缩感知专题笔记——目录
  4. 解决debian apt-get upgrade 错误triggers ci file contains unknown directive `interest-noawait'
  5. 【Python】Error:Input 'y' of 'Add' Op has type float32 that does not match type int32 of argument 'x'.
  6. 数据结构--快速排序
  7. Ehab and Prefix MEXs CodeForces - 1364C(思维)
  8. centos系统linux复制命令行,linux系统CentOS7中find命令使用
  9. css 动画 - 这次不会忘记了
  10. 12GB+512GB售价18999元起,华为发布Mate X2典藏版
  11. maven异常001---报错The folder is already a source folder.的解决办法
  12. 计算机科学 高中研究项目,高中信息科技教学中渗透计算机科学史的实践研究...
  13. CCF201409试题
  14. 继云计算巨头失火后,微软决定送数据中心去“泡澡”!
  15. Android触摸屏校对,android实现触摸屏校准
  16. java espresso_Espresso 列表
  17. 收藏 40 2 CPD (广告合作方式)
  18. 连续时间周期信号傅里叶级数
  19. 全栈工程师的百宝箱:黑魔法之文档篇
  20. 【毕业设计/Matlab系列】基于PCM编译码和2ASK调制解调的通信系统仿真

热门文章

  1. const与static的区别
  2. 大型网站技术架构:核心原理与案例分析 mobi_大数据技术经典学习路线
  3. python字典与顺序有关吗_python – 为什么在字典和集合中的顺序是任意的?
  4. mysql 事务回滚_SQL基础丨事务处理
  5. vc6开发一个抓包软件_开发一个软件多少钱?3种软件开发公司报价
  6. 易语言怎么判断文件是否一样_怎么判断专利代理人或专利代理机构是否靠谱?...
  7. 作者:刘剑(1979-),男,中国联合网络通信集团有限公司信息化事业部项目一处工程师...
  8. 李国杰(1943-),男,博士,中国工程院院士。
  9. 程序员必须关注的技术趋势,内附PDF下载链接
  10. MySQL数据库----触发器