MySQL - 插入查询需要很长时间
MySQL - INSERT queries taking long time
我有一个 table 大约有 10.000 行。
table 的结构是:
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;
键:
- 主要(cycle_id、subject_id、market_id、价格)
- FK1 (market_id)
- FK2 (subject_id)
- FK3 (currency_id)
像这样的查询经常需要很长时间(大约1秒):
INSERT INTO poptavky VALUES
(4, 'user', 17, 110, 'pound', 110) ,
(4, 'user', 17, 90, 'pound', 120) ,
(4, 'user', 17, 70, 'pound', 130) ;
问题出在哪里?
谢谢
听起来您使用的不是非常高端的服务器,而且您的问题因索引过多而变得更加复杂。
这个索引本身就相当庞大:
PRIMARY (cycle_id, subject_id, market_id, price)
它跨越四列,其中两列是 varchar 列。这本身不会有问题。但你还有三个:
FK1 (market_id)
FK2 (subject_id)
FK3 (currency_id)
每次插入后,数据库都必须重新计算索引,当索引数 and/or 索引长度很高时,这会花费很多时间。尤其是一次性插入大量数据时。
尝试使用这种请求:
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 行一样慢。
我有一个 table 大约有 10.000 行。 table 的结构是:
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;
键:
- 主要(cycle_id、subject_id、market_id、价格)
- FK1 (market_id)
- FK2 (subject_id)
- FK3 (currency_id)
像这样的查询经常需要很长时间(大约1秒):
INSERT INTO poptavky VALUES
(4, 'user', 17, 110, 'pound', 110) ,
(4, 'user', 17, 90, 'pound', 120) ,
(4, 'user', 17, 70, 'pound', 130) ;
问题出在哪里? 谢谢
听起来您使用的不是非常高端的服务器,而且您的问题因索引过多而变得更加复杂。
这个索引本身就相当庞大:
PRIMARY (cycle_id, subject_id, market_id, price)
它跨越四列,其中两列是 varchar 列。这本身不会有问题。但你还有三个:
FK1 (market_id)
FK2 (subject_id)
FK3 (currency_id)
每次插入后,数据库都必须重新计算索引,当索引数 and/or 索引长度很高时,这会花费很多时间。尤其是一次性插入大量数据时。
尝试使用这种请求:
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 行一样慢。