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

回答星球水友提问:沈老师,我听网上说,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,其索引与记录的结构是这样的:

b3517b9fe1295c69eae95a3717ee06ab.png

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

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

画外音:

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

(2)MyISAM可以没有PK; MyISAM使用索引进行检索时,会先从索引树定位到记录指针,再通过记录指针定位到具体的记录。

画外音:不管主键索引,还普通索引,过程相同。InnoDB则不同,其索引与记录的结构是这样的:

9731ac2296c14c133dba2355a3b9c2b6.png

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

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

画外音:

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

(2)InnoDB一定会有聚集索引; InnoDB通过主键索引查询时,能够直接定位到行记录。

809ddc4f0b3f86b60a5723d9dbc93398.png

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

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

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

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

身份证作为主键

其他属性上建立索引

user(id_code PK,

id_md5(index),

name(index),

birthday(index));

b1e84eeff0c8f9ca0fbaa293e00d487d.png

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

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));

df2cf0a0a0d03d7dfa8975cf3054c714.png

如此一来,有限的缓冲区,能够缓冲更多的索引与行数据,磁盘IO的频率会降低,整体性能会增加。 总结(1)MyISAM的索引与数据分开存储,索引叶子存储指针,主键索引与普通索引无太大区别;(2)InnoDB的聚集索引和数据行统一存储,聚集索引存储数据行本身,普通索引存储主键;(3)InnoDB不建议使用太长字段作为PK(此时可以加入一个自增键PK),MyISAM则无所谓;

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

本文由 58沈剑 发布在 ITPUB,转载此文请保持文章完整性,并请附上文章来源(ITPUB)及本页链接。

原文链接:http://www.itpub.net/2019/10/02/3310/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机有多少种开发语言,为什么现在会有这么多种编程语言?

21世纪,计算机的应用越来越多,为了适应各种使用场景,于是诞生了各种语言,不仅语言是多样的,每种语言下面都有不同的开发框架,框架也是多样的。有时候为了性能,可能会选择编译型语言,…

mysql是小型数据库_mysql小型数据库

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

计算机保护地阻值,机房接地系统的一般接地电阻要小于多少欧姆?

机房接地系统宜采用综合接地方案,综合接地电阻应小于1欧姆。机房接地系统:(1)机房有四种接地方式:交流工作地、安全保护地、直流工作地和防雷保护地。(2)信号系统和电源系统、高压系统和低压系统不应使用共地回路。(3)灵敏电路的接地应各自隔…

计算机丢失wpcap.dll会影响什么,Win7系统提示wpcap.dll丢失如何解决?

最近有Win7系统用户反映,打开程序或者玩游戏的过程中都会出现wpcap.dll丢失的提示,这直接导致了程序无法正常打开以及游戏无法正常运行,用户为此非常苦恼。那么,Win7系统提示wpcap.dll丢失如何解决呢?下面,…

centos安装mysql5.7.12_CentOS二进制安装MySQL5.7.12

1、检查服务器上是否有其他版本的mysql数据库,可能会影响现有安装的数据库,卸载之yum -y remove mysql-libs-5.1.73* (rpm -e mysql..... --nodeps)2、安装mysqltar -zxvf mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz -C /usr/local/(解压安装包文件)mv …

vue打包上线部分css效果错乱,vue-cli2打包后css部分样式错乱

鼓捣半天,现在如下配置,能成功运行。还在查资料ingbuild/utils.js...function generateLoaders (loader, loaderOptions) {const loaders options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]if (loader) {loaders.push({loader: loader …

mysql搜索标题及时间_mysql搜索标题,描述和多行标记

我有以下表格。入口表描述--------------------------------------------------------------------| Field | Type | Null | Key | Default | Extra |--------------------------------------------------------------------| id | int(11) unsigned | NO | PRI | NULL | auto_…

ajax让服务器崩溃,详解ajax的data参数错误导致页面崩溃

今天准备把选定表格的其中一行的数据通过ajax传给后端,但是网站确崩溃了。代码如下:$(.icon-edit).click(function (event) { 这是一个按钮o$(.icon-edit).index($(this))1;edit.style.displayblock;//console.log($(this),$(this).parent().parent());l…

linux 启动一个网站_在线试用 200 多种 Linux 和 Unix 操作系统

只要打开该网站,选择你需要的 Linux/Unix 发行版,然后开始试用!-- Sk(作者)不久前我们介绍过 OSBoxes ,该网站提供了一系列免费且开箱即用的 Linux 和 Unix 虚拟机。你可以在你的 Linux 系统中下载这些虚拟机并用 VirtualBox 或 V…

搭建微信令牌中控服务器,使用ThinkJs搭建微信中控服务的实现方法

本人前端渣渣一枚,这篇文章是第一次写,如果有硬核bug,请大佬们轻喷、指出... 另外,本文不涉及任何接口安全、参数校验之类的东西,默认对调用方无脑级的信任:joy: 目前自用的接口包括但不限于以下这些|--- 微信相关| |-…

小黑框如何连接mysql_珍藏版(cmd小黑框)数据库命令及操作

话不多说直接来,后续补充。查看数据库show databases;创建数据库create database 2018;使用数据库use 2018;查看数据库中的所有表show tables;删除数据库drop database 库名;create table student(id int(10) auto_increment primary key,name varchar(20) not null…

DS系列服务器硬盘扇区,硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)...

硬盘的DOS管理结构1.磁道,扇区,柱面和磁头数硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区&…

arm ubuntu 编译boost_为arm linux 交叉编译boost 1.33.1

首先在arm linux环境上要有zlib1 解开boost压缩包, cd进入解压目录2 编译出bjam,并配置好,看手册页3 产生Makefile: ./configure "-sBUILDdebug release static/dynamic" --without-python4 更改Makefile:把文件头上的几个变量改成下面这样,我…

华为服务器sn号查询网站,linux 查询服务器sn

linux 查询服务器sn 内容精选换一换Linux云服务器变更规格时,可能会发生磁盘挂载失败的情况,因此,变更规格后,需检查磁盘挂载状态是否正常。本节操作介绍变更规格后检查磁盘挂载状态的操作步骤。以root用户登录云服务器。执行以下…

jdba访问mysql_mysql连接出现问题记录

解决:Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone valu//报错信息Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ‘‘ is unrecognized or represents…

mysql 存储引擎版本_mysql不同版本和存储引擎选型的验证

Mysql的版本和存储引擎较多,为了选择最适合业务使用的系统,需要进行一定的验证,本文描述mysql的验证过程和思路。主要涉及:Mysql的版本v Mariadbv Tokudbv Oracle具体的存储引擎v Myisamv Innodbv TokuDBv Maria如下是具体的思路M…

python制作表白神器_python制作exe可执行表白神器-Go语言中文社区

1、效果图2、程序源码import turtleimport time#writing txtturtle.hideturtle()turtle.penup()turtle.goto(130,50)# turtle.pendown()turtle.color("blue")turtle.write("亲爱的,给你画个东西",font ("Times",18,"bold"…

qtp连接mysql 无驱动_QTP连接MySQL

1、安装 Connector/ODBC2、查看数据源名称『控制面板』- 『管理工具』- 『数据源(ODBC)』-『添加』3、连接数据库Dim Conn,ConnString创建数据库实例Set ConnCreateObject("ADODB.Connection")连接字符串ConnString"Driver{Mysql ODBC 5.2w Driver};DATABASEmys…

python3如何安装selenium_Mac-Firefox浏览器+selenium+Python3环境安装

1.安装selenium安装命令:pip3 install selenium2.53.6如果之前已经安装过了,可以先卸载pip3 uninstall selenium使用selenium2.53.6版本是因为-selenium2的版本会更加稳定(切记注意版本号,很多问题都是由于版本不兼容导致的哦2.安装Firefox浏…

python保存模型的路径怎么写_使用python在MongoDB中保存机器学习(ML)和深度学习(DL)模型...

我们知道,当我们训练机器学习或深入学习模型时,我们必须保存训练过的模型,以便将来进行预测。现在的训练模型非常昂贵,所以如果我们能够保存它们并将其用于解决其他一些问题。例如,一个训练过的能够识别汽车的神经网络…