MySQL BIGINT(20) 与 Varchar(31) 性能对比

2023-12-09

我读过,像 23423423423423423637 这样的 bigint 作为 primare 唯一键比像 961637593864109_412954765521130 这样的 varchar 更好,但是how当有 100 万行时,我永远不会排序而只选择/更新一行,差异很大。使用 varchar 对我来说会更舒服,并且当性能差异低于 30% 或任何其他值时我会继续使用它。我找不到任何基准。


这确实必须进行衡量,我们可以根据我们所知道的和我们假设的情况做出一些“猜测”,但这些只是猜测。

您没有提及该表是 InnoDB、具有动态行的 MyISAM 还是具有固定长度行的 MyISAM。这将会产生一些影响。

但对于像您发布的那样的值,'961637593864109_412954765521130'(31 个字符),假设您使用单字节字符集(例如 latin1),或将这些特定字符编码为单字节的字符集(例如 utf8)...

对于 InnoDB 和 MyISAM 动态格式,该行需要 31+1-8=24 个额外字节。 (BIGINT 适合 8 个字节,31 个字符的 VARCHAR(31) 值将使用 32 个字节。)

对于具有固定长度行的 MyISAM 表,每行相差 23 个字节。 (为所有 31 个字符保留空间,并且不必存储长度。)

该主键值也将在每个索引中重复,因此每个索引的空间也会增加。

假设使用 BIGINT 的表行为 120 字节,使用 VARCHAR 的行为 144 字节,这是20%增加。行越大,增加的百分比越小,反之亦然。

对于 1,000,000 行(我很想说“one meelyun rows”,就像邪恶博士将小指放在嘴角说“100 万美元”一样)每行额外的 24 个字节总计约为 24MB。

但这并不是那么容易。就 InnoDB 空间而言,问题在于如何将行“适合”到块中。平均行大小越大,块中的可用空间量就越大。

如果除了将行存储在磁盘上之外不对这些行执行任何操作,那么实际上只是增加了磁盘空间以及用于备份的额外时间和空间。


如果块中适合的“144 字节”行数与“120 字节”行数相同,那么您不会看到任何空间差异。但是,如果一个块中容纳的行数较少,那么块数就会增加,InnoDB 缓冲池中的空间就会增加,I/O 也会增加,等等。


对于单行查询,无论是通过主键值还是通过其他唯一索引查找,差异都可以忽略不计。

如果您正在处理较大的结果集,则需要额外的内存来准备结果集,以及传输到客户端的额外字节等。


如果 VARCHAR 键的设计方式使得一起访问的行“组”具有相同的键值前导部分,那么使用 InnoDB,实际上可能会有一些性能改进。这是因为主键是簇键……满足查询所需的行更有可能位于同一个块中,而不是分散在一堆块中。

相反,如果执行插入和删除,某些块中将会有更多的可用空间。 (通过删除,已删除行的空间保留在块中;要重用该空间,您需要插入具有相同键值的行(或者至少有一个足够接近的键值,使其位于同一块中) .)通过随机插入,我们将得到块分割。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL BIGINT(20) 与 Varchar(31) 性能对比 的相关文章

  • Doctrine 不会在 MySQL 中生成跨数据库外键约束

    我有两个表 db1 Contact 和 db2 Recipient 每个收件人都应该是联系人 因此我在 db1 Contact ContactID 字段上的两个表之间设置了外键 我在 Recipient php 中使用以下注释表示这一点 O
  • 脚本超时已过,如果要完成导入,请重新提交相同的文件,导入将恢复

    我有一个数据库 拉开拉链后的尺寸50mb拉链尺寸7mb所以当我尝试导入数据库时zipped 7mb 几分钟后 它抛出此错误 脚本超时已过 如果您想完成导入 请resubmit相同的文件和导入将恢复 我已经重新提交了 但仍然没有导入全部数据
  • UI5 性能参数:data-sap-ui-preload 与 data-sap-ui-async

    不同的SAPUI5性能指南提到了两个关键参数 它们似乎具有相似的性质 但解释略有不同 data sap ui preload async https help sap com viewer b4b7cba328bc480d9b373c7da
  • RESTful Web 服务:java.lang.NullPointerException service.AbstractFacade.findAll

    我使用 NetBeans 7 的 来自数据库的 RESTful Web 服务 向导创建了一个简单的 XML Web 服务 此时 我想从关联的 mySQL 数据库发布用户列表 当我尝试通过其 URL http localhost 8080 d
  • PHP 5.4 PDO 无法使用旧的不安全身份验证连接到 MySQL 4.1+

    我知道有很多类似的问题 事实上我已经阅读了所有 9 个问题 但是 他们都没有解决我的问题 我有一个共享托管包 最低限度 我的包中包含域名和托管 MySQL 服务器的单独 IP 地址 为了开发 我正在使用http localhost 与 PH
  • 找时间通过 PHP 执行 MySQL 查询

    我在互联网上看到过这个问题 here http www phpbuilder com board showthread php t 2100256 and here http answers yahoo com question index
  • 如何使用 PHP 通过 JSON 发送 HTML 元素?

    以下功能 try query this gt pdo gt prepare SELECT FROM bookings WHERE TourID AND dTourDate and Status NOT LIKE Cancelled quer
  • 存储过程函数中的动态表名

    我编写了一个存储过程函数来从表中获取名称 问题是我希望将表名作为参数传入 有几个不同的表我需要使用此函数 DELIMITER CREATE DEFINER root localhost FUNCTION getName tableName
  • 重复键错误不会取消/回滚mysql事务

    当在 mysql innodb 事务中时 我希望重复的键错误会导致回滚 它没有 相反 它只是抛出一个错误并继续执行下一个命令 一旦到达 COMMIT 命令 事务将被提交 没有重复键导致命令 这是预期的行为吗 如果是这样 如何设置它以便在发生
  • 使用unittest时如何知道每次测试花费的时间?

    Unittest 仅显示运行所有测试所花费的总时间 但不单独显示每个测试所花费的时间 使用unittest时如何添加每个测试的计时 我想 目前不可能 http bugs python org issue4080 http bugs pyth
  • mclapply 用户时间大于已用时间

    我正在尝试使用mclapply的功能parallel封装在R 该函数通过计算对数似然距离将值分配给序列矩阵 这是一个 CPU 密集型操作 所结果的system time价值观令人困惑 gt system time mclapply work
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • mysql 中 INSERT 语句的计算列

    假设我想要一个表来记录其他表中的日期和列数 或者任何类型的数学 字符串连接等 CREATE TABLE log id INTEGER NOT NULL AUTO INCREMENT date DATETIME NOT NULL count
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所
  • 软删除最佳实践(PHP/MySQL)

    Problem 在处理产品和订单的 Web 应用程序中 我想维护前员工 用户 与他们处理的订单之间的信息和关系 我想维护过时产品和包含这些产品的订单之间的信息和关系 然而 我希望员工能够整理管理界面 例如删除前员工 过时的产品 过时的产品组
  • 如何将变量设置为触发器 MYSQL 内存储过程的结果?

    我这里有一个小问题 我正在为我的数据库工作创建一个触发器 但我不知道如何在触发器内使用存储过程 我想将过程的结果保存在变量中 然后使用稍后在 IF 比较器上变量 这是我的代码 DELIMITER CREATE TRIGGER insert
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 如何将多个实体集绑定到一个 odata 控制器?

    我有很多不同的实体想要为其启用 OData 这些实体根据其类型分为不同的组 目前 默认设置是将 EntitySet 与控制器名称相匹配 但我不希望为我拥有的每个实体类型都有一个控制器 有没有一种方法可以将多个 EntitySet 映射到一个
  • 将动态连接字符串与 Breeze EFContextProvider 结合使用

    目前我有一个应用程序 web silverlight 其中我的 ObjectContext 的连接字符串是动态的 它基于用户登录的方式 因为我的每个客户都有自己的数据库 即 用户名 域 我试图找到一种使用 EFContextProvider
  • CSS 使 DIV 位置固定在具有 PE​​RSPECTIVE 属性的 DIV 内部

    我有一个获取问题 fixed with position fixed关系到 container 检查这个小提琴 https jsfiddle net a1zoghs0 2 我知道 如果我把 fixed在外面 container 它将有pos
  • GCC 有多少个优化级别?

    多少GCC优化级别有哪些 我尝试了 gcc O1 gcc O2 gcc O3 和 gcc O4 如果我使用非常大的数字 它将不起作用 不过 我已经尝试过 gcc O100 它编译了 有多少个优化级别 迂腐地说 您可以为 gcc 提供 8 个
  • 如何在 VSTS 构建代理上的本地主机上打开 TCP 端口?

    使用 Visual Studio Team Services 的在线托管版本时 我的单元测试无法连接到侦听生成代理本地主机上的 TCP 端口的服务 该服务能够启动并打开 TCP 端口 但在单元测试中似乎无法访问 错误信息 2017 06 2
  • ActionController::RoutingError(未初始化常量 AdminsController)

    我正在使用 Rails 3dhtmlxGrid 我创建了一个名为的控制器admin我们定义了 3 个函数 例如view data dbaction及其视图文件 下面是我的admin控制器文件 class AdminController lt
  • 无需 jQuery 即可平滑滚动锚链接

    是否可以使用平滑滚动来锚定链接 但是without jQuery 我正在创建一个新网站 但我不想使用jQuery 扩展这个答案 https stackoverflow com a 8918062 3851798 定义scrollTo函数后
  • 如何使用 wp7 的 GPS 获取地址名称

    我可以使用 GeoCoordinateWatcher 类获取 Windows Phone 7 上的当前 GPS 坐标 如下所示msdn 我只能得到Latitude and 经度值 但我想得到Address那个位置的 市场上有一个名为 Whe
  • 为什么 map/filter ... 不适用于无数组?

    Nothing 不是所有类型的子类型吗 scala gt val array new Array 5 array Array Nothing Array null null null null null scala gt array map
  • 列出所有应用程序 - 输出为文本文件

    我只是想知道如何使用最好的 applescript 来查找 Mac OS X 10 5 上安装的所有应用程序 并将其所有应用程序名称输出到文本文件中 Mac OS X 下安装的所有应用程序都注册在启动服务数据库 Launch Service
  • 如何使用 GitHub API?

    当它告诉我使用时 我不确定这意味着什么 GET repos owner repo commits sha 我如何使用该 API 调用来检索我正在查找的信息 GET repos owner repo commits sha GET是用于调用此
  • 绕特定点旋转(例如,绕0,0,0旋转)

    我一直在这个问题上进行了很多搜索 但我找不到真正合适的答案 我需要围绕给定点 例如 0 0 0 旋转圆柱体 但圆柱体的枢轴是默认给定的 我该如何改变它 I found this主题 这正是我想做的 但我不知道如何用 java 来做 为了更好
  • 列出实现接口的类的所有属性

    我有一个带有接口的类 TInterface interface IXMLNode function Get One Boolean function Get Two Boolean function Get Three Boolean pr
  • php - 我应该在调用 Location: header 之后调用 exit() 吗? [复制]

    这个问题在这里已经有答案了 调用重定向函数头后 是否应该调用 exit 谢谢 你绝对应该 单独设置标头不会终止脚本执行
  • 在 .NET C# 中存储加密密钥的最佳方法

    在我们的应用程序中 我们有很多敏感的配置设置 我们将它们存储在再次加密的 xml 文件中 该安全文件必须在运行时解密并读取配置值 但是出现了一个问题 密钥和初始化向量是硬编码在代码中的 因此任何人都可以使用 Reflector 读取它 在
  • 使用java从服务器(ServerSocket)读取客户端(客户端Socket)上的字节包

    我是新人 我是一名 Java 开发人员 新手 目前我正在从事 BSE 项目 我面临着从服务器 服务器套接字 读取客户端 客户端套接字 上的字节包的问题 如果你能帮助我 请帮助我 提前致谢 好吧 如果你想直接与数据包交互 那么你需要使用Dat
  • 如何从User字段LookupId获取用户

    我在 sharepoint 在线有一个列表 在这个列表中 我有一个人员字段 当我调用 API 端点来获取列表中的所有项目时 我获得了 person 字段的 LookupId 值 我尝试使用lookupid的值来获取用户 但它不起作用 因为该
  • 为什么 Hibernate 会忽略 package-info.java?

    我正在尝试在包级别上使用 Hibernate TypeDef 注释 正如它所描述的那样休眠文档 我在用着Hibernate 3 6 and Spring 3 0 7 代码编译并显示package info class位于类路径中 但 Hib
  • 我们究竟如何计算时间戳差异?

    我们将时间戳作为姿势 图片和点数据的双精度值 它们并不总是对齐 如何计算两个时间戳之间的时间距离 是的 我知道如何减去两个双精度数 但我完全不确定增量如何与时间相对应 我有一些有趣的时间戳数据可以阐明您的问题 但没有准确回答它 我一直在尝试
  • MySQL BIGINT(20) 与 Varchar(31) 性能对比

    我读过 像 23423423423423423637 这样的 bigint 作为 primare 唯一键比像 961637593864109 412954765521130 这样的 varchar 更好 但是how当有 100 万行时 我永