0

なぜこのようなクエリに時間がかかるのか (文字通り 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行の小さなテストクエリが大幅に高速化されました。

私は 2 つの方法で測定しました。1 つは phpMyAdmin で、もう 1 つは DOM ロードの時間を調べました (もちろん、他のプロセスが含まれます)。

DOM の負荷は 44 秒から 1 秒になり、98% 増加しました。

しかし、クエリ実行時間の差ははるかに劇的で、43.4 秒から 0.0052 秒になり、99.988% 減少しました。かなり良い。膨大なデータセットからの結果を報告します。

4

2 に答える 2

2

=の代わりに使用しLIKEます。 =よりもはるかに高速である必要がありますLIKE--は、テキストのどこにでも「何か」があるものにLIKE一致する のように、パターンの一致のみを目的としています。'%something%'

このクエリがある場合:

SELECT * FROM myTable where myColumn LIKE 'blah'

myColumn = 'blah'MySQL は、パターンが固定されていてワイルドカードがないことを認識しているため、入力したふりをしてこれを最適化できます。upcしかし、列に次のデータがある場合はどうなるでしょうか。

blah
foo
bar
%foo%
%bar
etc.

MySQL はクエリを事前に最適化できません。これは、一致させようとしているテキスト%foo%. したがって、 のすべての値に対して、 のすべてのLIKE値に対して一致する全文検索を実行する必要があります。シンプルで定義したインデックスを使用すると、これは不要になり、クエリは劇的に高速になります。temp_val_import_435.valueattr_upc.upc=

于 2013-11-09T00:50:39.293 に答える
0

本質的に、問題になる LIKE に参加しています (インデックスを使用している場合、MySQL を確認するには EXPLAIN が必要です)。これを試して:

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`
于 2013-11-09T00:50:51.173 に答える