数据库,主键为何不宜太长长长长长长长长?

回答星球水友提问:沈老师,我听网上说,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则无所谓;

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

Image placeholder
Godlovecheng
未设置
  57人点赞

没有讨论,发表一下自己的看法吧

推荐文章
如何不写css使div居中显示

如何不写css使div居中显示不使用css使div居中显示,可以使用标签,对其所包括的文本进行水平居中。html代码如下: 这是div 效果:(相关课程推荐:css视频教程)标签说明HT

基于中台实践的DevOps平台有何不同?

为了响应快速变化的市场需求,业务要快速迭代。IT正在向云原生架构转型,解放架构自由度,最大化业务敏捷性,解耦合、敏捷开发、快速部署是当下企业的追求,可以消除研发与运维之间鸿沟的DevOps(研发运维)

10分钟,用TensorFlow.js库,训练一个没有感情的“剪刀石头布”识别器

大数据文摘出品编译:Luciana、小七、宁静“剪刀石头布”是我们小时候经常玩的游戏,日常生活中做一些纠结的决策,有时候也常常使用这种规则得出最后的选择,我们人眼能很轻松地认知这些手势,“石头”呈握拳

支付宝安全实验室发现3款恶意库,提醒开发者擦亮眼

近日,支付宝天宸实验室发现在Python官方的第三方库下载网站上有三款第三方恶意库。当开发者安装使用时,可能被安装恶意程序。这三个恶意库的链接如下:roels:https://pypi.org/pro

GORM 中文文档_5.0. 复合主键

可以设置多个字段为主键来开启复合主键功能: typeProductstruct{ IDstring`gorm:"primary_key"` LanguageCodestring`gorm:"prima

MySQL 数据库操作:创建和查看数据库

数据库是数据的集合。MySQL允许我们高效地存储和检索数据库中的数据。在MySQL中,我们可以使用CREATEDATABASE语句创建数据库。但是,如果数据库已经存在,则会引发错误。为了避免该错误,我

MySQL 数据库操作:删除数据库

使用MySQL的DROPDATABASE命令可以很容易的删除一个数据库。数据库删除的同时,所属的数据表将一起被删除。如果删除的数据库不存在,则会引发错误。为了避免错误的发生,可以在DROPDATABA

平安科技数据库总经理汪洋:开源数据库在平安的应用实践

本文转自| 平安科技数据库产品团队2019年5月9日,平安科技数据库产品及存储产品部总经理在第十届数据库技术大会DTCC上分享了《开源数据库在平安的应用实践》,本文根据演讲内容整理,围绕以下几个方面进

2019数据库趋势研究:谁是最受青睐的数据库?

哪些数据库在2019年最受青睐?本文向DeveloperWeek的数百名业内人士咨询了当前NoSQL与SQL的使用情况,得到了有关MySQL、MongoDB、PostgreSQL、Redis和其他方面

2019数据库趋势研究:谁是最受青睐的数据库?

哪些数据库在2019年最受青睐?本文向DeveloperWeek的数百名业内人士咨询了当前NoSQL与SQL的使用情况,得到了有关MySQL、MongoDB、PostgreSQL、Redis和其他方面

借力中国数据库技术大会 达梦DM8数据库新品正式发布

5月8日—10日,第十届中国数据库技术大会(DTCC2019)如约而至。本届大会以“数据风云,十年变迁”为主题,设定2大主会场及21个技术专场,邀请了来自国内外互联网、金融、教育等行业百余位技术专家,

会唱歌的程序员为何如此受欢迎?

 作者 朱小五爱奇艺的独家综艺《乐队的夏天》总决赛终于落下了帷幕,虽然决赛过程有些“曲折”,但是我最喜欢的刺猬乐队,仍然凭借自己的硬实力,最终排在第二名!值得一提的是,这只乐队的吉他手兼主唱也是一位程

2019全球PostgreSQL生态报告出炉,PG为何从RDBMS中脱颖而出?

墨墨导读:本文是近期ScaleGrid发布的2019PG趋势报告,从不同的角度解读了PostgreSQL如何在众多优秀的RDBMS中脱颖而出,原文:https://scalegrid.io/blog/

字节跳动(今日头条),为何战斗力如此凶猛?

有没有研究过今日头条?还有没有上升空间?早些时候,「今日头条」还是这间公司最重要的产品,自从「抖音」日活跃用户量(DAU)接近「今日头条」后,这间公司对外的名称由今日头条 改为 字节跳动。字节跳动是母

SAP CEO孟鼎铭为何在任职十年之际选择退出?

2019年10月11日,SAP宣布执掌时间长达9年多的孟鼎铭(BillMcDermott),将辞去首席执行官职位。公司启动了长期继任者计划,SAP执行董事会成员JenniferMorgan和柯睿安(C

为何jsx文件必须引入react

为何jsx文件必须引入react本质上来说JSX是React.createElement(component,props,...children)方法的语法糖。所以我们如果使用了JSX,我们其实就是在

原生线程池这么强大,Tomcat 为何还需扩展线程池?

前言Tomcat/Jetty是目前比较流行的Web容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度。JDK提高完整线程池实现,但是Tomcat/Jetty都没有直接使用。

2019年度总结:支付宝为何多次亮相各大国际顶会

2019年,是人工智能与机器学习技术快速发展的一年。对于蚂蚁金服而言,过去一年的人工智能技术、产品、解决方案及研究成果已经在NeurIPS、KDD、ICML、SIGMOD、SIGIR等各大国际顶会上陆

腾讯基于全时态数据库技术的数据闪回

作者简介:李海翔,网名“那海蓝蓝”,腾讯金融云数据库技术专家。中国人民大学信息学院工程硕士企业导师。著有《数据库事务处理的艺术:事务管理和并发访问控制》、《数据库查询优化器的艺术:原理解析与SQL性能

从关系型数据库到分布式机器学习,揭秘腾讯大数据十年发展历程

大数据技术在过去10多年中极大改变了企业对数据的存储、处理和分析方式。如今,大数据技术逐渐成熟,涵盖了计算、存储、数仓、数据集成、可视化、NOSQL、OLAP分析、机器学习等丰富领域。在未来,大数据技

大数据是个技术,数据库才是它最好的产品形态

星环科技(以下简称:星环)的定位是大数据基础软件公司,而非数据库公司,却在数据库方面,做的比很多数据库公司更好更猛?这是为何?“我们认为,大数据是个技术,数据库才是它最好的产品形态”,星环科技研发总监

数据基础设施重定义 华为AI-Native数据库全球发布

2019年5月15日,华为公司在北京面向全球发布了人工智能原生(AI-Native)数据库GaussDB和分布式存储FusionStorage8.0。发布会上,华为常务董事、ICT战略与Marketi

MongoDB数据库因安全漏洞,导致Family Locator泄露二十多万名用户数据

摘要:本月第二次,未受保护的MongoDB数据库因大量安全漏洞而导致敏感信息泄露,受欢迎的家庭跟踪应用程序FamilyLocator已经暴露了超过238,000名用户的实时未加密位置数据。该应用程序非

海量数据时代,金融行业数据库实践难题如何解决?

随着数字经济时代的到来,大数据、人工智能技术得到了快速发展与应用,可以说,各行各业都已全情投入到这一波数字化转型浪潮中,把握新的发展机遇,获取数字红利。其中,金融行业可以说是走在转型之路最前沿的行业之

MySQL 亿级数据数据库优化方案测试-银行交易流水记录的查询

作者:逸宸a链接:https://www.jianshu.com/p/cbdef47fb837对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适?比如银行交易流水