Mysql中Text和Varchar的性能差异

Din*_*mar 5 performance varchar temporary-tables mysql-5.7

我正在 mysql 5.7 中试验 text 和 varchars。我创建了一个简单的 mysql 表,如下所示

创建表small_table(
   pkint(11) NOT NULL AUTO_INCRMENT,
   varcvarchar(255) DEFAULT NULL,
   txttext,
  首要的关键 (pk)
) 引擎=InnoDB AUTO_INCRMENT=103925 默认字符集=utf8

该表大约有 100k 行。

我已经执行了以下查询并对两者进行了分析

查询 1(对 varchar 列进行分组)

通过varc从small_table组中选择varc,count(*);

配置文件 1 结果

+----------------------+----------+
| 状态 | 持续时间 |
+----------------------+----------+
| 开始| 0.000064 | 0.000064
| 检查权限 | 0.000004 |
| 开桌 | 0.004812 |
| 初始化| 0.000026 | 0.000026
| 系统锁| 0.000005 | 0.000005
| 优化| 0.000006 | 0.000006
| 统计 | 0.000010 | 0.000010
| 准备| 0.000006 | 0.000006
| 创建临时表 | 0.000021 | 0.000021
| 排序结果 | 0.000003 |
| 执行| 0.000001 |
| 发送数据| 0.052795 | 0.052795
| 创建排序索引| 0.000049 | 0.000049
| 结束 | 0.000003 |
| 查询结束 | 0.000006 | 0.000006
| 删除 tmp 表 | 0.000004 |
| 查询结束 | 0.000002 |
| 结束表| 0.000006 | 0.000006
| 释放物品| 0.000021 | 0.000021
| 清理 | 0.000018 | 0.000018
+----------------------+----------+

临时表详细信息 1

+------------------------+--------+
| 变量名 | 价值|
+------------------------+--------+
| 创建_tmp_disk_tables | 0 |
| 创建_tmp_表| 1 |
+------------------------+--------+

查询 2(按文本列分组)

select txt,count(*) fromsmall_table group by txt;

剖面 2 结果

+----------------------+------------+
| 状态 | 持续时间 |
+----------------------+------------+
| 开始| 0.000134 | 0.000134
| 检查权限 | 0.000010 | 0.000010
| 开桌 | 0.006690 |
| 初始化| 0.000034 | 0.000034
| 系统锁| 0.000007 | 0.000007
| 优化| 0.000004 |
| 统计 | 0.000017 | 0.000017
| 准备| 0.000008 |
| 创建临时表 | 0.000027 | 0.000027
| 排序结果 | 0.000005 | 0.000005
| 执行| 0.000002 |
| 发送数据| 26.359877 |
| 创建排序索引| 0.001042 | 0.001042
| 结束 | 0.000007 | 0.000007
| 查询结束 | 0.000007 | 0.000007
| 删除 tmp 表 | 0.000208 |
| 查询结束 | 0.000003 |
| 结束表| 0.000007 | 0.000007
| 释放物品 | 0.000028 | 0.000028
| 清理| 0.000020 |
+----------------------+------------+

临时表详细信息 2

+------------------------+--------+
| 变量名 | 价值|
+------------------------+--------+
| 创建_tmp_disk_tables | 1 |
| 创建_tmp_表| 1 |
+------------------------+--------+

除了“发送数据阶段”之外,两个配置文件在每个阶段花费的时间几乎相同。第一个花了 0.052795 秒,第二个花了 26.359877 秒。为什么那个阶段差别这么大?(没有 group by 子句的相同查询在“发送数据阶段”中没有显示任何差异)

tom*_*bom 7

性能差异主要是由于文本数据类型列总是复制到磁盘上的临时表,因为内存引擎不支持这些类型。

\n\n

手册中:

\n\n
\n

使用临时表处理的查询结果中的 BLOB 或 TEXT 列实例会导致服务器使用磁盘上的表而不是内存中的表,因为 MEMORY 存储引擎不支持这些数据类型 (请参见第 8.4.4 节,\xe2\x80\x9c 内部临时表\n 在 MySQL\xe2\x80\x9d 中使用)。使用磁盘会导致性能损失,因此仅当确实需要时才在查询结果中包含 BLOB 或 TEXT 列。

\n
\n\n

显然,当您不使用时group by,不需要临时表。

\n