我正在使用一个非常简单的 InnoDB 表(名为 Test)进行一些测试,其结构如下:
Id int(10) unsigned NOT NULL AUTO_INCREMENT
UserId int(10) NOT NULL
Body varchar(512) COLLATE utf8_unicode_ci NOT NULL
CreatedAt datetime NOT NULL
UserId 上还有一个附加索引:
KEY Idx_Test_UserId (UserId) USING BTREE
当我尝试执行此查询时......
INSERT INTO Comments (UserId,Body,CreatedAt) VALUES (1,'This is a test',NOW())
...有时我会在几毫秒内完成操作,但有时则需要大约一秒钟。
我对简单的 SELECT 语句有同样的问题:
SELECT Body FROM Comments WHERE UserId=1
我是唯一一个对这个特定表进行测试的人,我真的不明白为什么会有这样的执行时间差异。
最后要注意的是,当我使用 MyISAM 表进行相同的测试时,没有遇到任何问题。
答案1
对于 InnoDB,“auto_increment”变量应该位于索引中(第一个或单独一个),以避免一些锁定问题。据我所知,MyISAM 不会发生这种情况。
顺便问一下,为什么“Id”不是主键?这并不是必要的,只是“看起来”它应该是这个表的主键。