資料庫的架構如下。
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,記憶體:4GB ddr2,CPU 2.0Ghz 雙核心,硬碟 7200RPM 32MB 快取 640GB。
為什麼 SELECT * FROM 花費的時間幾乎是 100 倍items
;與插入items
...;對我來說永遠沒有任何意義。它仍然是一個只有 70 行的小表,即使它有 0 行,也花了那麼長時間。
編輯:此外,該表還有很多其他表透過 id 連結到自身。其中有一些連結到它並執行 on update=cascade;刪除=級聯;。我相信這是最大的問題。如果是的話,我可能可以進去更改它,並在刪除各種小東西時對其進行單獨刪除。插入速度似乎約為 0.2 秒,無論我是在僅執行插入操作items
還是在另一個具有到主表的外鍵連結的表上執行插入操作。
答案1
好吧,我的第一個猜測是你的 InnoDB 可能壞了。你可以檢查是否有
- 觸發器會在插入時執行緩慢的操作
- 正在進行的進程會鎖定表
- 指向該表的外鍵/約束
針對可能導致此類問題的任何情況徹底審核資料庫的最佳方法是從 mysqldump 命令讀取模式轉儲。