【发布时间】:2013-11-09 00:36:21
【问题描述】:
您能告诉我为什么这样的查询需要这么长时间(字面意思是 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%。不错。我将报告来自大量数据集的结果。
【问题讨论】:
-
tempval_import_435 中没有 attr_id 列
-
等等,这是一个错字。我修好了。
-
你为什么用
LIKE而不是=? -
@EdCottrell 查询在我认为应该使用的 varchar 列上
LIKE -
=应该比LIKE快得多——LIKE仅用于匹配模式,如'%something%',它匹配文本中任何位置带有“something”的任何内容。跨度>
标签: mysql