一张图有多个标美国服务器签,一个标签可以搜索出多张图,同时搜索还能返回总的数量(这样才可以进行分页吧?),标签之间可以组合搜索,mysql 应该做不了这种需求,那就是用 elastic 做的?但 elastic 支持这种分页功能?而且我印象中 elastic 搜索不快(用 kibana 搜后端 log 几秒延迟),能做成这么高性能?
有点好奇这种常用功能是怎么实现的。
假设有个 image 表,和 image has tag 表,那 mysql 查询有 3 个指定 tag 的语句就是
select * from images where id in (select image_id from image_has_tag where tag_name = '1' or tag_name = '2' or tag_name = '3' grouping by image_id having count(*) = 3)
不一定完全对,大概这个样子
稍微改一下就可以查 “有指定 5 个 tag 中 3 个或以上的” 图片等高级搜索
这样性能上能满足要求吗?看着功能确实是可以这样实现的,但 pixiv 少说也有 10 个 tag 以上,后面的子查询可以查出 10w 的 image_id,我有点怀疑能不能在 1s 内返回。
不过如果分库分表+很多个读副本的话,应该也能提高很多性能吧,看起来之前我有点思维误区了。
性能不太清楚,只知道这样可以实现,没有真正实践过
pgsql 的 gin 倒排索引了解下?
MySQL 能做,用 MySQL 的 WordPress 不就可以这样么。
图片跟文章一样在 posts 表,标签在 terms 表,图片和标签的关系在 relationships 表。
relationships 表有 post_id 和 term_id,连表查询就行了,单标签多标签都一样查,我做过,只是当时数据少,不知道数据多了性能怎么样。
搞张中间关系表就能做了
三张表, 用表连接查, 不用子查询.
建立合适的索引, 连接查询能缩小范围的条件写前面.
(最好先查询小表).
在某个 pixiv 员工的[基础设施介绍]( https://speakerdeck.com/konoiz/pixivniokerumysqlyun-yong-falseshi-ji?slide=13)里可以看到他们搜索是用 Solr 来实现的
如果用中间表的话,此表膨胀速度太快了~