mysql - 如何优化用于获取与另一张图像颜色相似的图像的 MySQL 查询?

标签 mysql performance join

我必须获取与另一个颜色相似的项目(图像)。我为每张图像以十六进制格式将 5 种主要颜色保存到数据库中。基本上我现在做的是:

  1. 从用于搜索具有相似颜色的其他图像的图像中获取 5 种主要颜色。
  2. 检查其他图片的颜色是否与这 5 种颜色中的一种相匹配。
  3. 仅显示具有至少 1 种匹配颜色的图像。
  4. 按匹配的颜色数和图像 ID 对结果进行排序。

这是“颜色”表,我在其中保存所有颜色及其 ID:

enter image description here

  • 索引:

enter image description here

这是“colors_rel”表,我在其中添加了用于将颜色与项目 ID 链接起来的记录:

enter image description here

  • 索引:

enter image description here

我不会在此处粘贴我的“项目”表,因为我们将要考虑的查询不会使用它。

最后这是我正在使用的示例查询:

enter image description here

这是解释的结果:

enter image description here

可能有趣的一件事是所有的十六进制值都是这样的: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/

相关文章:

php - 检索与 PHP mysqli_real_connect() 建立连接需要多长时间

performance - Haskell 风格/效率

python - 合并 'left' ,但尽可能覆盖 'right' 值

java - JPA JOIN 查询列表仅给出一项而不是所有项

php - CDbCriteria 只返回一个表数据而不是来自连接的数据

用于创建过程的 MySQL Shell 脚本

尽管返回 ID,MySQL 存储过程仍不插入数据

mysql - 连接2个表,需要根据最高价格显示所有字段,并且不同字段没有重复项

mysql - 用于超大数据集的 RDBMS——人们在使用什么?

java - 提高将 JSON 流存储到 Android 上的本地数据库的性能