当数据适合行时,VARCHAR 与 TEXT 性能比较

2023-11-26

mysql> desc temp1;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| value | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

mysql> desc temp2;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| value | text | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+

255 - 每行中有 'a' 字符(在两个表中)

mysql> select * from temp1 limit 1;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| value                                                                                                                                                                                                                                                           |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

mysql> select * from temp2 limit 1;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| value                                                                                                                                                                                                                                                           |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

查询表1:

select count(*) from temp1 where value like '%a';

查询表2:

select count(*) from temp2 where value like '%a';

Stats:

No of records---temp1(varchar)---temp2(text)


2097152---------6.08(sec)--------6.91(sec)          
4194304---------12.42(sec)-------13.66(sec)
8388608---------25.08(sec)-------28.03(sec)
16777216--------52.82(sec)-------56.88(sec)
33554432--------1(min)50.17(sec)-1(min)59.36(sec)

我的问题:如何解释执行速度的差异?

两个表中的行内容相同。

据我了解VarChar and Text仅当内容超过行大小时,列才将内容保留在页面之外。所以这两个表的内容都将是我的内联数据page size(16kb)。那么造成这个查询执行时间差异的原因是什么呢?

注意:两个表列都没有索引

Row Format - DYNAMIC

Collation - UTF8mb3

Character set - utf8_general_ci

Storage engine -  innodb

Mysql - 5.7

参考链接:https://stackoverflow.com/a/48301727/5431418

Update:现在我在两个表中尝试使用相同的流程,使用 5000 个字符 ('a'),结果差异很大。

2097152---------1(min)53.63(sec)--------2(min)4.66(sec)    

更新2:现在我尝试在两个表中使用 2 个字符('a')相同的流程仍然存在性能差异

添加表状态:

mysql> select * FROM information_schema.tables  WHERE table_schema = "db67006db" and table_name = 'temp1';
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME         | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| def           | db67006db    | temp1      | BASE TABLE | InnoDB |      10 | Dynamic    |   30625036 |            315 |  9659482112 |               0 |            0 | 425721856 |           NULL | 2019-09-23 20:20:17 | NULL        | NULL       | utf8_general_ci |     NULL |                |               |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
1 row in set (0.01 sec)

mysql> select * FROM information_schema.tables  WHERE table_schema = "db67006db" and table_name = 'temp2';
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME         | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| def           | db67006db    | temp2      | BASE TABLE | InnoDB |      10 | Dynamic    |   30922268 |            315 |  9753853952 |               0 |            0 | 425721856 |           NULL | 2019-09-23 20:20:12 | NULL        | NULL       | utf8_general_ci |     NULL |                |               |
+---------------+--------------+------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+

让我们使用一些工具

自从最初的预感(见下文)是错误的,尝试通过运行您的查询MySQL工作台为了聚集查询性能统计.


最初的预感(没有结果)

只是一个想法:

  • TEXT磁盘上的列大小是2 + Nbytes,其中 N 是字符串的长度
  • VARCHAR takes 1 + N字节(对于 N ≤ 255)或2 + N字节(对于 256 ≤ N ≤ 65535)

尝试扩大列中文本的大小256以上字符并重新运行测试。它们的运行性能可能会更加接近。

另请注意,您发布的差异以每条记录的微秒数表示,因此可能存在许多操作系统事件或非常简单的问题if (TEXT) {do some additional IO or housekeeping}源代码中的代码路径。

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

当数据适合行时,VARCHAR 与 TEXT 性能比较 的相关文章

  • 当服务器时区不是 UTC 时,从 Java 中的 MySQL 检索 UTC DATETIME 字段

    我正在尝试编写代码以使用 Java 和 MySQL 与第三方开发的数据库进行互操作 该数据库有一个字段 用于存储时间戳DATETIME字段作为 UTC 日期 运行数据库和客户端的服务器的时区设置为非 UTC 时区 Europe London
  • MySQL 无法使用 PHP 连接到本地主机上的服务器

    我正在使用 XAMPP 1 7 2 可以通过 cmd 和 SQLYog 连接到 MySQL 但不能以编程方式连接 这段 PHP 代码 conn mysql connect localhost root if conn die Could n
  • 如何测量 Storm 拓扑中的延迟和吞吐量

    我正在通过示例学习 StormExclamationTopology https github com nathanmarz storm starter blob master src jvm storm starter Exclamati
  • mysql utf8_general_ci 区分大小写

    我有一个 mysql 数据库 我使用 utf8 general ci 不区分大小写 在我的表中 我有一些列 例如 ID 和区分大小写的数据 例如 iSZ6fX 或 AscSc2 为了区分大写和小写 最好只在这些列上设置 utf8 bin 如
  • MySQL - 如何按相关性排序? INNODB表

    我在一个名为 cards 的 INNODB 表中有大约 20 000 行 所以 FULLTEXT 不是一个选项 请考虑这张表 id name description 1 John Smith Just some dude 2 Ted Joh
  • 我不小心锁定了 MySQL 的 root

    我在 OS X 上使用 MySQL 并使用删除了所有 root 用户DROP USER 然后我又添加了其中一些并做了GRANT ALL on to root localhost 然后在验证确实是的之后注销 我可以登录并执行一些特权操作 不幸
  • 从高斯分布中采样随机值的最快方法是什么?

    The Box Muller 变换 http en wikipedia org wiki Box E2 80 93Muller transform 是一种从高斯分布中采样随机值的优雅且性能合理的方法 我正在寻找一种用 C 编写 清晰的更快方
  • 为什么这个 MySQL 更新不起作用?

    有一张桌子叫meterreadings 我需要复制属性meterreading从一排到另一排 这是数据示例 id meterreadingdate meterreading meterreadingtype id created 1 201
  • MySQL 命令输出在命令行客户端中太宽[重复]

    这个问题在这里已经有答案了 我在用mysql终端模拟器中的命令行客户端lxterminal在Ubuntu中 当我运行以下命令时 mysql gt select from routines where routine name simplep
  • MySQL - 此版本的 MySQL 尚不支持“LIMIT 和 IN/ALL/ANY/SOME 子查询”

    这是php编码我正在使用的 Last Video db gt fetch all SELECT VID thumb FROM video WHERE VID IN SELECT VID FROM video WHERE title LIKE
  • mysql变量赋值:如何强制赋值顺序?

    由于mysql是一种声明性语言 我找不到强制赋值变量顺序的方法 采取这个查询 SET v1 0 SET v2 0 SELECT v1 v2 FROM MyTable table WHERE v1 v2 is not null AND v2
  • 从 .frm 文件恢复 mysql 数据库

    我每周都会倾倒所有桌子以获得备份 但后来我明白它只是存储表的 frm文件 它不显示表的 MYD 和 MYI 文件 所以我只有我的数据库的 frm 文件 而且我的数据库是innodb 那么我可以用数据库中的数据获取我的数据库吗 是的 这是可能
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • 将 HTML 字符串加载到 UIWebView 中的延迟

    我在导航控制器中有两个视图控制器 第一个视图控制器有一个带有按钮的菜单 按下此按钮将移动到第二个视图控制器并将 html 字符串加载到 UIWebView 中 没有其他东西被加载到 webview 中 只是一个简单的 NSString 其中
  • SQL Server:比较两个表中的列

    我最近完成了从某些应用程序的旧版本到当前版本的迁移 在迁移数据库时遇到了一些问题 我需要一个可以帮助我比较两个表中的列的查询 我的意思不是行中的数据 我需要比较列本身来弄清楚我错过了表结构的哪些变化 看一下红门 SQL 比较 http ww
  • 计算行数并仅获取表中的最后一行

    我有一张桌子叫employeexam其结构和数据是这样的 id course id employee id degree date 1 1 3 8 2013 01 14 2 2 4 15 2013 01 14 3 2 4 17 2013 0
  • 在 MySQL 中搜索多个单词

    我使用 HTML 表单来允许用户查找数据库表中的条目
  • 左连接 SQL 求和

    我有两张桌子想要加入 比如说表 a 和表 b 表 b 有许多行指向表 a 表 b 包含价格 实际上是一个购物篮 所以我想要的是表a中的所有记录和表b中的价格之和 我努力了 select a sum b ach sell from booki
  • 为什么运行 docker 容器后 mysql 数据所有权更改为 systemd-journal-remote

    我的mysql数据库存储在 home mysql代替 var lib mysql 该目录曾经属于mysql 但是 当我运行命令时docker compose up使用这个 yml 文件 version 3 services mariadb
  • Microsoft SQL 数据库的 WebSocket 侦听器

    我目前正在开发一个项目 该项目必须使用 WebSockets 作为将数据传输到客户端的方式 基础设施看起来像这样 客户端 gt Web 服务器 gt Microsoft SQL 数据库 我想最理想的情况应该是这样的 客户端打开一个到服务器的

随机推荐

  • SPA 中刷新令牌 Cookie 的 CSRF 保护

    我在 AngularJS SPA 中使用资源所有者密码凭据 OAuth 2 0 流程 有几篇文章 here here 以及答案这个问题这说明我们不应该将刷新令牌存储在 Web 客户端 LocalStorage 上 而是将它们加密存储在 Ht
  • 使用 android.telecom 和 InCallService 接听来电

    自 API 21 以来 Google 一直在添加功能android 电信总体而言 特别是通过实施更多成员电信经理并添加通话服务 最后一个应该允许非系统 第三方应用程序提供和替换系统呼叫应用程序通话中屏幕的功能 弹出并允许执行操作的窗口EXT
  • Asm代码解释

    以下 GCC 内联汇编取自 LuaJit 的 coco 库 有人可以逐行解释它的作用吗 static inline void coco switch coco ctx from coco ctx to asm volatile movl 1
  • tesseract 安装 mac 操作系统

    我正在尝试使用 homeBrew 在我的 mac 上安装 tesseract 当我尝试安装时 一切似乎都很好 但我收到以下错误 消息 Warning Could not link leptonica Unlinking Error The
  • shell脚本测试

    我正在尝试更新其他人编写的 bash 脚本 但遇到了一行我不确定的内容 谁能告诉我以下检查的作用 if RESULT 0 0 我假设它正在检查 RESULT 中的某些值 可能带有子字符串 任何帮助表示赞赏 命令 只是命令的别名test 右方
  • CORS 适用于对 API 的直接请求,但不适用于静态文件(如 css)

    我们正在开发一个由 Android 组成的项目Mobile App连同一个Web API Web API 是 Asp net MVC Core 我已经启用了CORS服务于我的Startup cs 因此移动应用程序 API 调用可以跨源访问
  • 迭代 std::deque 时擦除元素时出现分段错误

    为什么下面的代码会崩溃 当我通过反向迭代器进行迭代时应该做什么 那么如何删除单个元素呢 deque q q push back 4 q push back 41 q push back 14 for auto it q begin it q
  • pandas - 两列的直方图?

    我有这个数据 data pd DataFrame from dict r for r in response print data id total 0 213 1 1 194 3 2 205 156 现在 如果我打电话 data hist
  • 带有闪亮工具提示BS的反应式单选按钮

    我想创建一个radioButtons带有工具提示的小部件使用shinyBS 我想要实现的是创建一个带有 3 个按钮的小部件 其中包含不同的信息tooltip 基于此solution它创建了 3 个具有不同 id 值的独立单选按钮 是否可以做
  • intptr_t 是 uintptr_t 的有符号对应项(反之亦然)吗?

    我正在为 add signed MPL 类开发一些测试 将类型转换为其签名的对应项 它的定义如下 template
  • 在python中将url保存为文件名

    我有一个网址 例如 http example com here there index html 现在我想将文件及其内容保存在目录中 我希望文件名是 http example com here there index html 但我收到错误
  • 检测字符串是否为数字的最优雅的方法?

    有没有比这更好 更优雅 和 或可能更快 的方法 boolean isNumber false try Double valueOf myNumber isNumber true catch NumberFormatException e E
  • 是否可以将类内类的实例设置为 null

    是否可以将类内类的实例设置为 null 例如 我可以做这样的事情吗 int main Create a new test object Test test new Test Delete that object This method sh
  • Grit的clone方法未定义?

    我最近开始从事一个使用 git 进行存储并使用 ruby 作为前端的项目 我的脚本的第一个版本使用 ruby git 虽然非常简单 但还可以 当我需要对我的提交和日志进行更具体的工作时 建议我转向坚毅 然而 我在早期遇到了一个障碍 grit
  • 如何在wkwebview中下载文件

    有人请告诉我如何在 iOS wkwebview 中下载文件 我创建了一个 iOS 网络视图应用程序 在我加载的页面中 它有几个下载选项 但是当我单击下载时没有任何反应 注意 我不想创建额外的下载按钮 Since macOS 11 3 and
  • PHP json_encode 数组 0 键的问题

    我在使用 json encode 从数组生成 json 编码字符串时遇到问题 有问题的数组部分如下所示 RatingDistribution Array 11 elements 0 Array 1 element 0 String 3 ch
  • Pandas:根据其他行删除行

    我有一个 pandas 数据框 如下所示 qseqid sseqid qstart qend 2 1 125 345 4 1 150 320 3 2 150 450 6 2 25 300 8 2 50 500 我想根据以下条件删除基于其他行
  • 有没有办法在 iOS 上的 Safari 中禁用向后滑动动画?

    我想在 SPA 上完全禁用向后滑动动画 这将允许我在 SPA 中使用一些滑动手势 目前 在 iOS 上 当触发某些手势时 您往往还会触发向后滑动手势 我找到了关于如何禁用它的上一篇文章 iOS 7 有没有办法禁用 Safari 中的向后和向
  • Gradle 构建过程中使用了哪个已安装的 JDK

    这是我的输出gradle v 在使用包装器的项目中 gradlew v Gradle 5 0 Build time 2018 11 26 11 48 43 UTC Revision 7fc6e5abf2fc5fe0824aec8a0f546
  • 当数据适合行时,VARCHAR 与 TEXT 性能比较

    mysql gt desc temp1 Field Type Null Key Default Extra value varchar 255 YES NULL mysql gt desc temp2