Mysql / mariadb innodb:行大小会影响复杂的查询性能吗?

时间:2015-11-30 11:41:28

标签: mysql performance innodb mariadb query-performance

我的MariaDB 10服务器上有数百万行(统计事件)的InnoDB表,并且每行历史上都有一个长的用户ID char(44)字段(用作非唯一键)以及其他30个int / varchar字段(行大小约为240字节)。我的系统可以进行群组分析,漏斗,事件分段和其他常见统计 - 因此一些查询非常复杂,有很多连接。现在我有机会添加4字节的int字段并将其用作user-id和所有查询的主要非唯一键。但是由于实现细节,我需要在此表中保留旧的符号char(44)user-id - 一些数据源不是我的,只发送带有符号user-id的事件。

所以问题是:将 - 通常 - 保留或删除此char(44)字段会影响复杂查询的性能吗?它将像其他字段一样保留,并且不再用作查询中的键。我不想拆分表,因为有很多代码依赖于它的结构。

谢谢!

经过测试的Aria,发现它比InnoDB慢〜1.5倍,即使在简单的连接上也是如此。具有“冗余”行格式的InnoDB工作速度更快。所以 - 不,Aria不是妥协,它甚至比myISAM慢。我想InnoDB是Maria10中的XtraDB,这解释了速度。

还对自连接查询进行了一些测试,发现如果我们不使用此字段,则离开或删除char(44)字段对查询性能没有影响。

从char(44)键移到int会使查询快2倍!

1 个答案:

答案 0 :(得分:1)

切换到较短的整数键有助于查询性能。固定长度字符列的索引开销并不可怕。

如您所述,将更多RAM和/或某些SSD磁盘填充到数据库服务器中的成本很可能比重构程序的成本低。

真正将帮助您的查询效果是创建适当的compound covering indexes。如果您只是从这样的索引中获得了满足的查询,那么事情就会变得更快。

例如,如果你做了很多

SELECT integer_user_id
  FROM table
 WHERE character_user_id = 'constant'

然后(character_user_id)上的复合索引将使此查询非常快。

添加大量索引时要小心:在具有多个索引的表中,INSERT或UPDATE需要支付罚金。