Если бы это был я, я бы стал менее любопытным и кэшировал бы поиски во вторичной таблице, например:
CREATE TABLE `image_search` (
`id` int not null auto_increment,
`image_id` int not null,
`r` tinyint not null,
`g` tinyint not null,
`b` tinyint not null,
`distance` tinyint not null,
`hit` bool not null,
PRIMARY KEY (`id`),
UNIQUE KEY `image_id_by_rgb_by_distance` (`image_id`,`r`,`g`,`b`,`distance`),
KEY `image_id_by_rgb_by_distance_by_hit` (`image_id`,`r`,`g`,`b`,`distance`,`hit`),
);
Потяните оттуда, чтобы найти свои совпадения, например
SELECT `image_id`
FROM `image_search`
WHERE `r` = $r
AND `g` = $g
AND `b` = $b
AND `distance` = $distance
AND `hit` = 1
Если вы не получите результатов, тогда выполните
SELECT `image_id`
FROM `image_search`
WHERE `r` = $r
AND `g` = $g
AND `b` = $b
AND `distance` = $distance
и если нет результатов для , которые , то проведите сравнение с вашим каталогом изображений и сохраните каждый результат, положительный или отрицательный, в таблице.
Тогда это будет медленным, только когда результаты не будут кэшированы. Если ваш пользовательский интерфейс побуждает пользователя выбирать определенные полезные предустановленные цвета, вы можете предварительно рассчитать их и помочь еще больше.
Также бонусные баллы за предварительный расчет всех ранее выполненных поисков при добавлении изображения в каталог.