我有一个audit
表,其中有一个id
作为主键,有一个user_id
作为foreign key
和一个tableId
,{ {1}}和tableName
。所以:
parentTableId
:id
primary key
:user_id
到存储用户的foreign key
,显示谁对table
audit
中的记录进行了操作table
:索引tableId
而不是bigint
的{{1}},因为column
foreign key
存储了所有audit
表,table
代表发生事件的audit
中的给定记录tableId
:table
索引了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 }},使用parentTableId
和update
where tableName = 'concert' and parentTableId = -1
之间的关系。到目前为止,一切都很好。
但是,在创建parentTableId
记录时,客户端报告了速度下降。由于实际上我所有的其他更改都与concert
页的显示有关,而在创建音乐会记录时该页面并未执行,因此可以安全地假设我的其他更改均未引起速度下降。确切地说,在存储tour
方面进行了一些细微的更改,这些更改实际上是在创建table
记录时运行的,这些更改是很小的文本和计算调整,当出现以下情况时,这些调整不会导致速度降低concert
条记录正在存储。因此,要么是由于偶然而导致的放慢速度,要么是由于索引值方差的增加,我大量的audit
审核导致后来的放慢速度。
我没有提供audit
代码,因为这只是将concert
更改为正确的格式,并且只执行了一次,当客户端开始进行测试时,它没有运行,因此从我们的角度来看这无关紧要。
因此,我想知道concert
是否可能成为速度下降的原因。我们知道,不同的update
值可以与同一个update
关联,但是取反是不可能的。
我的问题是:在我的情况下,索引是否会导致写入速度变慢?如果是这样,更改索引会提高写入性能吗?
我正在考虑更改索引的顺序,因此在检查parentTableId
约束之后,先处理index
,然后处理tableId
,最后处理parentTableId
。从理论上讲,这应该提高性能吗?