数据库的架构如下。
CREATE TABLE `items` (
`id` mediumint( 8 ) unsigned NOT NULL AUTO_INCREMENT ,
`name` varchar( 45 ) NOT NULL ,
`main_type` tinyint( 4 ) NOT NULL ,
`rarity` tinyint( 4 ) NOT NULL ,
`stack_size` smallint( 6 ) NOT NULL ,
`sub_type` tinyint( 4 ) NOT NULL ,
`cost` mediumint( 8 ) unsigned NOT NULL ,
`ilvl` smallint( 6 ) unsigned NOT NULL DEFAULT '0',
`flavor_text` varchar( 250 ) NOT NULL ,
`rlvl` tinyint( 3 ) unsigned NOT NULL ,
`final` tinyint( 4 ) NOT NULL DEFAULT '0',
PRIMARY KEY ( `id` ) ) ENGINE = InnoDB DEFAULT CHARSET = ascii;
现在,在这个表上执行插入操作需要 0.22 秒。我不知道为什么执行单行插入操作要花这么长时间。读取速度非常快,大约 0.005 秒。使用此处的示例配置开发mysql innodb平均约 0.002 到 0.005 秒。为什么执行一次插入操作要花费 100 倍以上的时间,这对我来说毫无意义。我的计算机如下。操作系统:Debian Sid x86-x64、Mysql 5.1、RAM:4GB ddr2、cpu 2.0Ghz 双核、HDD 7200RPM 32MB 缓存 640GB。
items
为什么 SELECT * FROM ; 比 INSERT INTO ...;花费的时间几乎是后者的 100 倍,items
我永远搞不懂。它仍然是一个只有 70 行的小表,即使它有 0 行,也花了那么长时间。
编辑:此外,此表还有相当多的其他表通过 id 链接到自身。其中有几个链接到它并执行 on update=cascade; on delete=cascade;。我认为这是这里最大的问题。如果是这样,那么我可能可以进入并更改它,并在删除时对各种小东西进行单独删除。插入速度似乎约为 0.2 秒,无论我是在主表上执行插入,items
还是在另一个具有外键链接到主表的表上执行插入。
答案1
嗯,我的第一个猜测是你的 InnoDB 可能坏了。你可以检查一下是否有
- 触发器会在插入时执行缓慢的操作
- 正在进行的将锁定表的进程
- 指向该表的外键/约束
彻底审计数据库以防止任何可能导致此类问题的因素的最佳方法是从 mysqldump 命令读取模式转储。