我的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倍!
答案 0 :(得分:1)
切换到较短的整数键有助于查询性能。固定长度字符列的索引开销并不可怕。
如您所述,将更多RAM和/或某些SSD磁盘填充到数据库服务器中的成本很可能比重构程序的成本低。
真正将帮助您的查询效果是创建适当的compound covering indexes。如果您只是从这样的索引中获得了满足的查询,那么事情就会变得更快。
例如,如果你做了很多
SELECT integer_user_id
FROM table
WHERE character_user_id = 'constant'
然后(character_user_id)
上的复合索引将使此查询非常快。
添加大量索引时要小心:在具有多个索引的表中,INSERT或UPDATE需要支付罚金。