【问题标题】:Why is this MySQL insert so slow?为什么这个 MySQL 插入这么慢?
【发布时间】:2012-11-19 11:02:57
【问题描述】:
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 毫秒。

  • church_id 在其他表中用作外键。
  • 名称和city_id 一起应该是唯一的。
  • city_id 是外键

这不是很多,我做错了吗?

【问题讨论】:

  • @juergend 是的,我也这么认为,但是索引是否过于复杂或不必要?我已经使用数据库几年了,但我从来没有考虑过性能,因为这只是为了好玩。但现在我看到其他人抱怨 40 毫秒!所以我开始怀疑。

标签: mysql optimization


【解决方案1】:

插入必须做很多工作:

  • 锁定表格
  • 检查唯一索引约束
  • 检查外键约束
  • 写入新记录
  • 更新索引
  • 解锁表
  • 写事务日志

【讨论】:

  • +1!我有一个插入一行的 AJAX,然后它再次选择同一行以查找自动生成的 ID 以发送回用户。您知道是否有任何方法可以在不进行选择的情况下获取生成的 ID?
  • 由于插入需要 160 毫秒,我正在寻找提高速度的方法。
  • @Student:使用LAST_INSERT_ID()
  • 使用mysqli_insert_id()(或您正在使用的 API 中的任何等效项)获取最后一个自动增量 ID。如果您连续执行大量插入操作,则可以通过将它们全部放在一个事务中来加快速度。
  • 谢谢!我在 PDO 中进行了快速搜索,但我只找到了描述下一个 auto_increment_id 的文章..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2012-08-10
  • 2011-03-11
相关资源
最近更新 更多