在我的情况下,是否在相同数量的行中索引更多的值会导致性能问题?

时间:2019-04-08 14:18:49

标签: mysql performance indexing

我有一个audit表,其中有一个id作为主键,有一个user_id作为foreign key和一个tableId,{ {1}}和tableName。所以:

  • parentTableIdid
  • primary keyuser_id到存储用户的foreign key,显示谁对table audit中的记录进行了操作
  • table:索引tableId而不是bigint的{​​{1}},因为column foreign key存储了所有audit表,table代表发生事件的audit中的给定记录
  • tableIdtable索引了tableName,并指出更改后的记录所属的地方
  • varchar(255)column索引了parentTableId,而不是bigint。父column由应用逻辑基于foreign key
  • 确定

还有许多其他table,并且该表有大约2000万条记录。现在,tableName大约有20个可能的值,在column的情况下,tableName的值为-1,但是音乐会的'concert'表为{{1 }}(我知道我可以通过为parentTableId名称创建parent并将'tour'用于table table中的名称来提高性能,但这需要大型重构,不一定会获得批准)。即使旧的foreign key记录有正确的audit,但有不正确的table,我仍然能够audit审核tableId到正确的{{1 }},使用parentTableIdupdate where tableName = 'concert' and parentTableId = -1之间的关系。到目前为止,一切都很好。

但是,在创建parentTableId记录时,客户端报告了速度下降。由于实际上我所有的其他更改都与concert页的显示有关,而在创建音乐会记录时该页面并未执行,因此可以安全地假设我的其他更改均未引起速度下降。确切地说,在存储tour方面进行了一些细微的更改,这些更改实际上是在创建table记录时运行的,这些更改是很小的文本和计算调整,当出现以下情况时,这些调整不会导致速度降低concert条记录正在存储。因此,要么是由于偶然而导致的放慢速度,要么是由于索引值方差的增加,我大量的audit审核导致后来的放慢速度。

我没有提供audit代码,因为这只是将concert更改为正确的格式,并且只执行了一次,当客户端开始进行测试时,它没有运行,因此从我们的角度来看这无关紧要。

因此,我想知道concert是否可能成为速度下降的原因。我们知道,不同的update值可以与同一个update关联,但是取反是不可能的。

我的问题是:在我的情况下,索引是否会导致写入速度变慢?如果是这样,更改索引会提高写入性能吗?

我正在考虑更改索引的顺序,因此在检查parentTableId约束之后,先处理index,然后处理tableId,最后处理parentTableId。从理论上讲,这应该提高性能吗?

0 个答案:

没有答案