【发布时间】:2016-03-04 00:59:33
【问题描述】:
我的 MariaDB 10 服务器上有数百万行(统计事件)的 InnoDB 表,并且每一行历史上都有一个长的 user-id char(44) 字段(用作非唯一键)以及其他 30 个 int/varchar 字段(行大小约为 240 字节)。我的系统可以进行同期群分析、漏斗、事件细分和其他常见的统计——所以一些查询非常复杂,有很多连接。现在我有机会添加 4 字节 int 字段并将其用作用户 ID 和所有查询的主要非唯一键。但由于实现细节,我需要在此表中保留旧的符号 char(44) 用户 ID - 一些数据源不是我的,仅使用符号用户 ID 发送事件。
所以问题是:一般来说,保留或删除这个 char(44) 字段会影响复杂查询的性能吗?它将像其他字符字段一样保持不变,并且不再用作查询中的键。我不想拆分表,因为有很多代码取决于它的结构。
谢谢!
测试了 Aria,发现它比 InnoDB 慢约 1.5 倍,即使是在简单的连接上也是如此。具有“冗余”行格式的 InnoDB 工作得更快。所以 - 不,Aria 不是妥协,它甚至比 myISAM 还要慢。我想 InnoDB 是 Maria10 中的 XtraDB,这解释了速度。
还对自连接查询进行了一些测试,发现如果我们不使用该字段,保留或删除 char(44) 字段对查询性能没有影响。
从 char(44) 键转移到 int 使查询速度提高了 2 倍!
【问题讨论】:
-
CHAR(44) utf8总是占用 132 个字节!INT只需要 4 个。更大 --> 占用更多空间 --> 每个块的记录更少 --> 更多 I/O --> 更慢。 -
@RickJames 当我没有在查询中提取它时,它不会影响,但是是的,它的冗余字段。但是由于第三方逻辑,目前我无法摆脱它。顺便说一句,为什么它是 132 字节?它是 latin1_bin
-
在您的情况下始终为 44 个字节。 (今天大多数人使用 utf8。)
标签: mysql performance innodb mariadb query-performance