我有一个包含 18 列的表,其中包含一个主键和 8 个索引。如果我通常连接到 H2 DB(嵌入式模式)并更新此表的非索引字段,则在 H2 控制台中更新 50000 条记录大约需要 20 秒。但是,如果我在连接字符串中设置 MVCC=true,然后尝试更新 SAME 50000 条记录,则该表甚至超过 30 分钟都不会更新
下面的架构
CREATE TABLE
TEMP
(
SWITCHIPADDRESS VARCHAR(16),
ID BIGINT NOT NULL IDENTITY,
MACADDRESS VARCHAR(14),
USERID VARCHAR(32),
TIMESTMP TIMESTAMP NOT NULL,
LINKCOUNT INTEGER,
HASLINKTOSWITCH BOOLEAN,
LINKIPADDR VARCHAR(16),
IFINDEX INTEGER,
PORT INTEGER,
SLOT INTEGER,
VLANID INTEGER,
IFSPEED INTEGER,
IFADMINSTATUS INTEGER,
PORTDUPLEXMODE INTEGER,
UNP VARCHAR(32),
DOMAIN INTEGER,
DISPOSITION INTEGER,
PRIMARY KEY (ID)
)
索引
KEY `ForwardIdx` (`SwitchIPAddress`,`MACAddress`,`slot`,`port`),
KEY `ForwardSwIPIdx` (`SwitchIPAddress`),
KEY `ForwardMACIdx` (`MACAddress`),
KEY `ForwardSlotIdx` (`slot`),
KEY `ForwardPortIdx` (`port`),
KEY `ForwardVlanIdx` (`VlanID`),
KEY `UserIdIdx` (`UserId`),
KEY `UNPIdx` (`UNP`)
我可以在跟踪日志文件中看到,数千个密钥首先被删除然后被添加,这可能需要一些时间。但我想知道,当正在做的事情是对非 idx 字段的简单更新时,为什么需要重新调整密钥。
即使我只有 1 个在 where 子句中使用的索引,问题仍然存在。
有人可以让我知道如何加快速度并提高更新性能。是设计删除然后添加leys>>
我们的应用程序是多线程的,我们遇到了“尝试锁定表的超时错误”问题,我在连接行中添加了 MVCC=true,现在又遇到了另一个问题。