MySQL UPDATE语句使用LIKE和2个表需要几十年的时间

MySQL UPDATE语句使用LIKE和2个表需要几十年的时间,mysql,Mysql,你能告诉我为什么这样一个查询需要20-30分钟的时间吗? 我似乎已经设置了适当的索引,不是吗 UPDATE `temp_val_import_435` t1, `attr_upc` t2 SET t1.`attr_id` = t2.`id` WHERE t1.`value` LIKE t2.`upc` CREATE TABLE `attr_upc` ( `id` int(11) NOT NULL AUTO_INCREMENT, `upc` varchar(255) NOT NULL,

你能告诉我为什么这样一个查询需要20-30分钟的时间吗? 我似乎已经设置了适当的索引,不是吗

UPDATE  `temp_val_import_435` t1,
`attr_upc` t2 SET t1.`attr_id` = t2.`id` WHERE t1.`value` LIKE t2.`upc`


CREATE TABLE `attr_upc` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `upc` varchar(255) NOT NULL,
 `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 UNIQUE KEY `upc` (`upc`),
 KEY `last_update` (`last_update`)
) ENGINE=InnoDB AUTO_INCREMENT=102739 DEFAULT CHARSET=utf8


CREATE TABLE `temp_val_import_435` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `attr_id` int(11) DEFAULT NULL,
 `translation_id` int(11) DEFAULT NULL,
 `source_value` varchar(255) NOT NULL,
 `value` varchar(255) DEFAULT NULL,
 `count` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `core_value_id` (`core_value_id`),
 KEY `translation_id` (`translation_id`),
 KEY `source_value` (`source_value`),
 KEY `value` (`value`),
 KEY `count` (`count`)
) ENGINE=InnoDB AUTO_INCREMENT=32768 DEFAULT CHARSET=utf8
Ed Cottrell的解决方案对我有效。使用=而不是LIKE大大加快了1000行上的较小测试查询

我测量了两种方法:一种是phpMyAdmin,另一种是查看DOM加载的时间,这当然涉及到其他进程

DOM负载从44秒增加到1秒,增加了98%

但是查询执行时间的差异要大得多,从43.4秒减少到0.0052秒,减少了99.988%。不错。我将报告来自大量数据集的结果。

使用=而不是类似的应该比LIKE-LIKE仅用于匹配模式快得多,如“%something%”,它将文本中的任何内容与任何地方的内容相匹配

如果您有此查询:

SELECT * FROM myTable where myColumn LIKE 'blah'
MySQL可以通过假装您键入了myColumn='blah'来对此进行优化,因为它看到模式是固定的,并且没有通配符。但如果您的upc列中有此数据,该怎么办


MySQL无法提前优化您的查询,因为它试图匹配的文本可能是一种模式,如%foo%。因此,它必须对temp_val_import_435.value的每个值和attr_upc.upc的每个值执行全文搜索,以查找相似的匹配项。使用simple=和您定义的索引,这是不必要的,查询速度应该会大大加快。

本质上,您加入的是一个类似的,这将是一个问题,如果使用索引,需要解释一下是MySQL。试试这个:

UPDATE  `temp_val_import_435` t1
INNER JOIN `attr_upc` t2
  ON t1.`value` LIKE t2.`upc`
SET t1.`attr_id` = t2.`id` WHERE t1.`value` LIKE t2.`upc`

tempval_import_435; id中没有列attr_id,请稍候,这是一个输入错误。我修复了它。为什么要使用LIKE而不是=?@EdCottrell该查询是在varchar列上进行的,我认为应该使用LIKE=应该比LIKE-LIKE只用于匹配模式快得多,例如在“%something%”中,它将文本中的任何内容与任何地方匹配。感谢您提供的有趣信息。我认为查询优化器可以从myColumn(如“\%”或“类似”)所在的表中快速选择COUNT*,以确定是否可以使用=号优化结束查询。但我想不是。我很快会尝试一下。我在一个大约1000行的较小数据集上测试了它。用=,用了大约1秒;用LIKE,用了大约44秒。谢谢嗨,谢谢你的建议。我的MySQL版本只支持SELECT语句,不支持EXPLAIN,但我可能很快就会升级。不过,我确实感觉到某种笛卡尔式的结果正在被处理。更新30k记录不需要17分钟,我认为MySQL可能会在内部使用我的语法执行与您在您的语法中显式使用的相同类型的连接。无论哪种方式,如果字段上的比较相似,则查询大约需要44秒,如果字段为=,则大约需要1秒。
UPDATE  `temp_val_import_435` t1
INNER JOIN `attr_upc` t2
  ON t1.`value` LIKE t2.`upc`
SET t1.`attr_id` = t2.`id` WHERE t1.`value` LIKE t2.`upc`