2012-12-01 121 views
2
CREATE TABLE IF NOT EXISTS `church` (
    `church_id` INT(11) NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(40) NOT NULL , 
    `city_id` SMALLINT(4) UNSIGNED ZEROFILL NOT NULL , 
    `validated` TINYINT(1) NULL , 
    PRIMARY KEY (`church_id`) , 
    INDEX `church.city_id-city.city_id_idx` (`city_id` ASC) , 
    UNIQUE INDEX `church-city_id` (`name` ASC, `city_id` ASC) , 
    CONSTRAINT `church.city_id-city.city_id` 
    FOREIGN KEY (`city_id`) 
    REFERENCES `city` (`city_id`) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 

我有我的本地主機(筆記本電腦)本表church。當我插入它(它現在有10行)時,它需要160毫秒。爲什麼這個MySQL插入太慢?

  • church_id被用作其他表中的外鍵。
  • 名稱和city_id應該是唯一的。
  • 的city_id是一個外鍵

這不是一個而是很多,我做了什麼了嗎?

+0

索引重建? –

+0

@juergend是的,我也會這麼想,但索引過於複雜或不切實際?我已經使用了數年的數據庫,但是我從來沒有考慮到性能,因爲它只是爲了好玩。但現在我看到其他人抱怨大約40毫秒!所以我開始想知道。 –

回答

3

插入要做相當多的工作的:

  • 鎖定表
  • 檢查唯一指標約束
  • 檢查外鍵約束
  • 寫新紀錄
  • 更新指標
  • 解鎖表
  • 寫事務升OG
+0

+1!我有一個插入一行的AJAX,然後它再次選擇同一行來查找自動生成的ID以發回給用戶。你知道是否有任何方式獲得生成的ID沒有做出選擇? –

+0

由於INSERT需要160ms,我正在尋找提高速度的方法。 –

+0

@Student:使用['LAST_INSERT_ID()'](http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id) –