插入查询在 SQL 中花费了很多时间

Posted

技术标签:

【中文标题】插入查询在 SQL 中花费了很多时间【英文标题】:A insert query took many time in SQL 【发布时间】:2019-02-18 12:25:45 【问题描述】:

由于某种原因,在我的数据库中的特定表中,插入一行大约需要 30 秒。

问题是,在我查看表格之前,每列文本都设置为 textarea,所以我更新了它以查看它是否提高了性能,但没有。

我也用复制表完成了它,因为它有一个插入到之前的触发器,它也有相同的配置问题。

但是,它仍然会出现问题。

有查询

INSERT IGNORE INTO bbdd_gestion_new.publicados
(sku, referencia, cantidad, estado_amazon,
 estado_ebay, EAN, ASIN, titulo, tipo,
 preciocompra, preciocompra_b, precioventa, precioamazon,
 short_description, short_description_en, short_description_de, descripcion,
 familiatienda,
 familiaebay, imagen, fecha,
 portes_N, portes_I1, portes_I2, revision, comentarios, ubicacion,
 peso, usuario, marca)
VALUES
('6920702794790-R', 'W17-BM5047', '1', 'No publicar', '7000',
 '6920702794790', 'B00K0EI562', 
 'Huawei E3131H - Llave Bluetooth 3G, color blanco.',
 'Retourware',
 '2.85', '2.85', '4.99', '0',
 'PRODUCTO RETOUR-WARE – Artículo original completo procedente de devolución. Su funcionamiento no ha sido comprobado. Puede mostrar signos de desgaste y/o carecer de su embalaje original e instrucciones. No ha sido aperturado ni manipulado para el aprovechamiento de sus componentes.',
 'PRODUCT RETOUR-WARE – Original item originating from return. Its operation has not been proven. It may show signs of wear and / or lack of its original packaging and instructions. It has not been opened or manipulated for the use of its components.',
 'PRODUKT RETOUR-WARE – Originalartikel, der von der Rücksendung stammt. Seine Funktionsweise wurde nicht nachgewiesen. Es kann Anzeichen von Verschleiß und / oder das Fehlen der Originalverpackung und der Gebrauchsanweisung aufweisen. Es wurde für die Verwendung seiner Komponenten nicht geöffnet oder manipuliert.',
 ' Huawei E3131 Llave 3 G soltarse todo operadorHSPA +/HSPA/UMTS/GSM/GPRS/EDGE',
 'Informatica>Categorias>Dispositivos de red>Adaptadores de red', '667049031>667050031>937958031>937959031',
 'https://images-eu.ssl-images-amazon.com/images/I/31sZA-aS1fL._SL160_.jpg',
 '2019-02-18 13:12:01', '3.99', '9.99', '9.99', '',
 'producto subido por cron_publicar_rotos',
 '', '1', 'user', 'Huawei');

有问题的表。

CREATE TABLE IF NOT EXISTS `publicados` (
`sku` varchar(20) NOT NULL,
`referencia` varchar(20) NOT NULL,
`cantidad` int(11) NOT NULL,
`estado_amazon` varchar(64) NOT NULL,
`estado_ebay` int(11) NOT NULL,
`EAN` varchar(24) NOT NULL,
`ASIN` varchar(24) NOT NULL,
`titulo` varchar(70) NOT NULL,
`tipo` varchar(15) NOT NULL,
`preciocompra` decimal(8,2) unsigned NOT NULL,
`preciocompra_b` decimal(8,2) NOT NULL,
`precioventa` decimal(8,2) NOT NULL,
`precioamazon` decimal(8,2) NOT NULL,
`short_description` varchar(256) NOT NULL,
`short_description_en` varchar(256) DEFAULT NULL,
`short_description_de` varchar(256) DEFAULT NULL,
`descripcion` varchar(4096) NOT NULL,
`familiatienda` varchar(100) NOT NULL,
`familiaebay` varchar(100) NOT NULL,
`imagen` varchar(100) NOT NULL,
`fecha` datetime NOT NULL,
`portes_N` decimal(8,2) NOT NULL,
`portes_I1` decimal(8,2) NOT NULL,
`portes_I2` decimal(8,2) NOT NULL,
`revision` varchar(1) NOT NULL,
`comentarios` varchar(256) NOT NULL,
`ubicacion` varchar(20) DEFAULT NULL,
`peso` decimal(6,3) NOT NULL,
`usuario` varchar(20) DEFAULT NULL,
`marca` varchar(24) DEFAULT NULL,
PRIMARY KEY (`referencia`),
KEY `cantidad` (`cantidad`),
KEY `sku` (`sku`),
KEY `ubicacion` (`ubicacion`),
KEY `fecha` (`fecha`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我正在使用 php 5.3 和 HeidiSQL 之类的查看器。 还有警告

警告:第 1 行的“short_description”列的数据被截断

警告:第 1 行的“short_description_de”列的数据被截断

【问题讨论】:

mysql 使用 php 和 heidiSQL 访问 你在使用索引吗? 那个索引是配置PRIMARY KEY (referencia), KEY cantidad (cantidad), KEY sku (sku), KEY ubicacion (ubicacion) , 键fecha (fecha) 几乎没有任何事情可以导致单行INSERT 花费 30 秒。是否同时发生了其他事情?尤其是同一张桌子?问题是否再次出现? 无特定进程 有时会持续 30 秒,再持续 40 秒。整个服务器正常工作,除非您插入该特定表。 【参考方案1】:

根据我的统计,您的简短描述的长度为 282,列设置为 256。增加列的长度以容纳最长的描述。一种选择是使用最大长度:VARCHAR(21844) CHARACTER SET utf8。

【讨论】:

或者干脆TEXT 我发现了问题并且是触发器:SELECT p.* FROM bbdd_gestion_new.publicados AS p LEFT JOIN bbdd_gestion_new.publicados_log AS pl ON p.referencia = pl.referencia WHERE pl.referencia IS NULL; Left join 至少需要 30 秒才能做出选择,我不知道为什么

以上是关于插入查询在 SQL 中花费了很多时间的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询插入时间过长

Oracle SQL 查询在 JdbcTemplate 和 SimpleJdbcTemplate 中花费的时间太长

SQL 查询比平时花费更多时间

如何在 sql 查询中插入 php 变量?

MySQL 上的 SQL 查询花费了三秒钟的时间,而数据库或 SQL 查询没有任何更改

如何在 Oracle SQL Developer 中执行超过 100 万条插入查询?