MySQL - INSERT 查询需要很长时间

Posted

技术标签:

【中文标题】MySQL - INSERT 查询需要很长时间【英文标题】:MySQL - INSERT queries taking long time 【发布时间】:2016-11-08 08:19:12 【问题描述】:

我有一个大约 10.000 行的表。 表结构为:

CREATE TABLE IF NOT EXISTS `demands` (
  `cycle_id` int(11) NOT NULL,
  `subject_id` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `market_id` int(11) NOT NULL,
  `price` int(11) NOT NULL,
  `currency_id` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `amount` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

键:

PRIMARY(cycle_id、subject_id、market_id、价格) FK1 (market_id) FK2 (subject_id) FK3 (currency_id)

这样的查询需要很长时间(大约1s):

INSERT INTO poptavky VALUES 
  (4, 'user', 17, 110, 'pound', 110) ,
  (4, 'user', 17, 90, 'pound', 120) , 
  (4, 'user', 17, 70, 'pound', 130) ; 

问题可能出在哪里? 谢谢

【问题讨论】:

哪个需要 1 秒?插入 3 行?还是插入全部 10K? 请为其他表格之一提供SHOW CREATE TABLE innodb_buffer_pool_size 的值是多少?你有多少内存? 【参考方案1】:

听起来您不是在非常高端的服务器上,并且您的问题因索引过多而变得更加复杂。

这个索引本身就相当庞大:

PRIMARY (cycle_id, subject_id, market_id, price)

它跨越四列,其中两列是 varchar 列。这本身不会有问题。但你还有三个:

FK1 (market_id)
FK2 (subject_id)
FK3 (currency_id)

每次插入后,数据库都必须重新计算索引,当索引数量和/或索引长度很高时,这会花费很多时间。特别是在一次插入大量数据时。

【讨论】:

【参考方案2】:

尝试使用这种请求:

INSERT INTO client (prenom, nom, ville, age)
 VALUES
 ('Rébecca', 'Armand', 'Saint-Didier-des-Bois', 24),
 ('Aimée', 'Hebert', 'Marigny-le-Châtel', 36),
 ('Marielle', 'Ribeiro', 'Maillères', 27),
 ('Hilaire', 'Savary', 'Conie-Molitard', 58);

SGBD 会更好地知道数据放在哪里。

尽管如此,尝试仅使用 1000 行,看看它是否与 10000 行一样慢。

【讨论】:

虽然拼出列名是明智的,但性能差异是微不足道的。

以上是关于MySQL - INSERT 查询需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

带有 NOT IN 子查询的 SELECT INTO 查询需要很长时间/挂起

即使我有索引,MySQL ORDER BY 也需要很长时间

MySQL 查询返回 JSON 数据需要很长时间

我想减少 MYSQL 查询执行时间。我的查询需要很长时间?

MySql 查询需要很长时间 PHP

在 MYSQL 表上选择查询需要很长时间并超时