我在 mysql 5.7 中试验 text 和 varchars。我创建一个简单的mysql表如下
CREATE TABLEsmall_table
(pk
int(11) NOT NULL AUTO_INCREMENT,varc
varchar(255) DEFAULT NULL,txt
text, 主键 (pk
) ) 引擎=InnoDB AUTO_INCREMENT=103925 默认字符集=utf8
该表有大约 100k 行。
我已经执行了以下查询并分析了两者
查询 1(按 varchar 列分组)
select varc,count(*) from small_table group by varc;
配置文件 1 结果
+----------+----------+ | 状态 | 持续时间 | +----------+----------+ | 出发| 0.000064 | | 检查权限 | 0.000004 | | 开桌 | 0.004812 | | 初始化 | 0.000026 | | 系统锁 | 0.000005 | | 优化 | 0.000006 | | 统计 | 0.000010 | | 准备| 0.000006 | | 创建 tmp 表 | 0.000021 | | 排序结果 | 0.000003 | | 执行 | 0.000001 | | 发送数据 | 0.052795 | | 创建排序索引 | 0.000049 | | 结束 | 0.000003 | | 查询结束 | 0.000006 | | 删除 tmp 表 | 0.000004 | | 查询结束 | 0.000002 | | 关闭表| 0.000006 | | 释放物品 | 0.000021 | | 清理| 0.000018 | +----------+----------+
临时表详情1
+--------------+------+ | 变量名 | 价值 | +--------------+------+ | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 1 | +--------------+------+
查询 2(按文本列分组)
select txt,count(*) from small_table group by txt;
配置文件 2 结果
+----------+------------+ | 状态 | 持续时间 | +----------+------------+ | 出发| 0.000134 | | 检查权限 | 0.000010 | | 开桌 | 0.006690 | | 初始化 | 0.000034 | | 系统锁 | 0.000007 | | 优化 | 0.000004 | | 统计 | 0.000017 | | 准备| 0.000008 | | 创建 tmp 表 | 0.000027 | | 排序结果 | 0.000005 | | 执行 | 0.000002 | | 发送数据 | 26.359877 | | 创建排序索引 | 0.001042 | | 结束 | 0.000007 | | 查询结束 | 0.000007 | | 删除 tmp 表 | 0.000208 | | 查询结束 | 0.000003 | | 关闭表| 0.000007 | | 释放物品 | 0.000028 | | 清理| 0.000020 | +----------+------------+
临时表详情2
+--------------+------+ | 变量名 | 价值 | +--------------+------+ | Created_tmp_disk_tables | 1 | | Created_tmp_tables | 1 | +--------------+------+
两个配置文件在每个阶段都花费了几乎相同的时间,除了“发送数据阶段”。第一个耗时 0.052795 秒,第二个耗时 26.359877 秒。为什么那个阶段差别这么大?(没有 group by 子句的相同查询在“发送数据阶段”中没有区别)
性能差异主要是由于文本数据类型列总是被复制到磁盘上的临时表中,因为内存引擎不支持这些类型。
从手册:
当您不使用时
group by
,显然不需要临时表。