Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非常慢的MySQL插入查询_Mysql - Fatal编程技术网

非常慢的MySQL插入查询

非常慢的MySQL插入查询,mysql,Mysql,我有一张桌子,里面有50万张唱片。它不是很大。一对varchar(255)字段、一些int、一个float和一对时间戳。ints上有索引,也有外键约束。插页花了很长时间。我说的是1-4秒插入一行。我已经多次处理慢速选择查询,但我一直在试图弄清楚这个插入是怎么回事 编辑:好的,我只是想知道如何调试这个,但是,这里有所有涉及的表。插入“成分”是永远需要的。希望以后把我的模式的一部分放到网上不会对我有什么影响 CREATE TABLE `ingredients` ( `id` int(11) NO

我有一张桌子,里面有50万张唱片。它不是很大。一对varchar(255)字段、一些int、一个float和一对时间戳。ints上有索引,也有外键约束。插页花了很长时间。我说的是1-4秒插入一行。我已经多次处理慢速选择查询,但我一直在试图弄清楚这个插入是怎么回事

编辑:好的,我只是想知道如何调试这个,但是,这里有所有涉及的表。插入“成分”是永远需要的。希望以后把我的模式的一部分放到网上不会对我有什么影响

CREATE TABLE `ingredients` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `quantity` float DEFAULT NULL,
  `food` varchar(255) NOT NULL,
  `unit_id` int(11) DEFAULT NULL,
  `ingredient_group_id` int(11) DEFAULT NULL,
  `order_by` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `range` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `unit_id` (`unit_id`),
  KEY `ingredient_group_id` (`ingredient_group_id`),
  CONSTRAINT `ingredients_ibfk_1` FOREIGN KEY (`unit_id`) REFERENCES `units` (`id`),
  CONSTRAINT `ingredients_ibfk_2` FOREIGN KEY (`ingredient_group_id`) REFERENCES `ingredient_groups` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=269974 DEFAULT CHARSET=utf8

CREATE TABLE `units` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `abbreviation` varchar(255) CHARACTER SET latin1 NOT NULL,
  `type` int(11) NOT NULL,
  `si` float NOT NULL,
  `lower_bound` float DEFAULT NULL,
  `lower_unit_id` int(11) DEFAULT NULL,
  `upper_bound` float DEFAULT NULL,
  `upper_unit_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `lower_unit_id` (`lower_unit_id`),
  KEY `upper_unit_id` (`upper_unit_id`),
  CONSTRAINT `units_ibfk_1` FOREIGN KEY (`lower_unit_id`) REFERENCES `units` (`id`),
  CONSTRAINT `units_ibfk_2` FOREIGN KEY (`upper_unit_id`) REFERENCES `units` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8

CREATE TABLE `ingredient_groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `recipe_id` int(11) NOT NULL,
  `order_by` int(11) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `recipe_id` (`recipe_id`),
  CONSTRAINT `ingredient_groups_ibfk_1` FOREIGN KEY (`recipe_id`) REFERENCES `recipes` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=32739 DEFAULT CHARSET=utf8

很多信息缺失,但我首先要检查的是:

  • 如果在MyISAM表上:非常零碎的文件,尤其是索引文件。使用
    filefrag
    进行检查。如果数据库随时间缓慢增长,则可能发生这种情况。如果是这样,只需关闭MySQL,复制数据库目录,重命名原始副本和新副本,然后重新启动MySQL

  • 如果您使用InnoDB表:一个基于文件的数据存储,同样也太零碎了。在这种情况下,碎片既可以在文件系统级别(如上所述检查和处理)也可以在数据存储级别(使用InnoDB工具)。在最坏的情况下,基于块设备的数据存储(不能从外部碎片化)可能会出现内部碎片化的坏情况

  • 一些基数极低的索引。也就是说,一个不唯一的索引,很少有不同的值,也就是说,有很多重复。该索引渐近逼近线性列表,具有O(n)个时间剖面。这可以是表上的索引,也可以是引用的外部索引

  • 读者争论。不太可能,但大量并发读卡器可能会使单个编写器陷入停顿

编辑

在阅读了您的定义之后,我认为
成分。单位id
成分。成分组id
是第一个要检查的候选,因为它们的基数似乎很低

第一种不太可能有用(你打算选择所有用勺子量的配料吗?),所以你可能干脆不吃了


第二个可能非常有用;但如果成分组很少,基数可能很低,会降低性能。要提高基数,请添加一些部分以使其更具辨别力。如果没有其他字段可能与组id一起出现在查询中,只需添加主id或创建日期,使其
(成分组id,id)
(成分组id,创建时间)
。增加复杂性以加快速度似乎有悖常理,但它确实有帮助。作为奖励,您可以将在创建的排序方式添加到任何查询中,该查询通过
成分组id
进行选择,而不会造成性能损失。

大量信息丢失,但我首先要检查的是:

  • 如果在MyISAM表上:非常零碎的文件,尤其是索引文件。使用
    filefrag
    进行检查。如果数据库随时间缓慢增长,则可能发生这种情况。如果是这样,只需关闭MySQL,复制数据库目录,重命名原始副本和新副本,然后重新启动MySQL

  • 如果您使用InnoDB表:一个基于文件的数据存储,同样也太零碎了。在这种情况下,碎片既可以在文件系统级别(如上所述检查和处理)也可以在数据存储级别(使用InnoDB工具)。在最坏的情况下,基于块设备的数据存储(不能从外部碎片化)可能会出现内部碎片化的坏情况

  • 一些基数极低的索引。也就是说,一个不唯一的索引,很少有不同的值,也就是说,有很多重复。该索引渐近逼近线性列表,具有O(n)个时间剖面。这可以是表上的索引,也可以是引用的外部索引

  • 读者争论。不太可能,但大量并发读卡器可能会使单个编写器陷入停顿

编辑

在阅读了您的定义之后,我认为
成分。单位id
成分。成分组id
是第一个要检查的候选,因为它们的基数似乎很低

第一种不太可能有用(你打算选择所有用勺子量的配料吗?),所以你可能干脆不吃了


第二个可能非常有用;但如果成分组很少,基数可能很低,会降低性能。要提高基数,请添加一些部分以使其更具辨别力。如果没有其他字段可能与组id一起出现在查询中,只需添加主id或创建日期,使其
(成分组id,id)
(成分组id,创建时间)
。增加复杂性以加快速度似乎有悖常理,但它确实有帮助。作为奖励,您可以将在处创建的排序方式添加到任何按成分组id选择的查询中,而不会造成性能损失。

您可能需要查看
成分.单位id
索引,因为它具有低选择性


插入是否同时发生?

您可能需要查看
成分.unit\u id
索引,因为它的选择性较低


插入是同时发生的吗?

原来我有一个触发器,它是这个bug的牺牲品:

我将它从IN改为an=,现在插入操作只需0.00秒


我完全忘了这张桌子上连着一个扳机。那是我的错。很抱歉,有人浪费时间试图帮助我,但无论如何还是非常感谢你。

事实证明,我有一个触发器,它是这个错误的牺牲品:

我将它从IN改为an=,现在插入操作只需0.00秒

我完全忘了这张桌子上连着一个扳机。那是我的错。对不起任何人,w