我必须获取与另一个颜色相似的项目(图像)。我为每张图像以十六进制格式将 5 种主要颜色保存到数据库中。基本上我现在做的是:
- 从用于搜索具有相似颜色的其他图像的图像中获取 5 种主要颜色。
- 检查其他图片的颜色是否与这 5 种颜色中的一种相匹配。
- 仅显示具有至少 1 种匹配颜色的图像。
- 按匹配的颜色数和图像 ID 对结果进行排序。
这是“颜色”表,我在其中保存所有颜色及其 ID:
- 索引:
这是“colors_rel”表,我在其中添加了用于将颜色与项目 ID 链接起来的记录:
- 索引:
我不会在此处粘贴我的“项目”表,因为我们将要考虑的查询不会使用它。
最后这是我正在使用的示例查询:
这是解释的结果:
可能有趣的一件事是所有的十六进制值都是这样的:x0x0x0,第 2、4 和 6 个字符总是 = 0;
我在具有 16gb 内存的四核机器上运行所有内容,查询运行的平均时间为 0.150 秒。这些是 my.cnf 设置的一些值:
key_buffer_size=256M
sort_buffer_size=16M
query_cache_size=32M
query_cache_type=1
query_cache_limit=2M
tmp_table_size=512MB
max_heap_table_size=512MB
read_buffer_size=262144
我希望你们知道执行此查询的更好方法。这是我网站的主要瓶颈。谢谢。
最佳答案
因为我没有得到其他答案,所以我发布了我能够实现的目标:
- 我将 colors 表的 ID 列的数据类型从 mediumint(8) 更改为 smallint(5),这应该给我一个更小的索引,但性能改进非常小。
- 我尝试只存储十六进制颜色的第一个、第三个和第五个字符,因为其他字符始终为 0。再次获得与前一点相同的好处。
- 我找到的唯一真正的解决方案是创建另一个表,基本上存储每个项目与其他每个项目匹配的颜色数。但通过一些微积分,我发现该表目前需要大约 4十亿 条记录,因此我选择在每次执行该查询时等待 100 毫秒,而不是处理如此庞大的表。
所以现在找到的解决方案是:这个问题没有简单的解决方案,值得花时间,如果有人有更好的解决方案,我会很乐意听取。
关于mysql - 如何优化用于获取与另一张图像颜色相似的图像的 MySQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20706884/