一张图有多个标签,一个标签可以搜索出多张图,同时搜索还能返回总的数量(这样才可以进行分页吧?),标签之间可以组合搜索,mysql 应该做不了这种需求,那就是用 elastic 做的?但 elastic 支持这种分页功能?而且我印象中 elastic 搜索不快(用 kibana 搜后端 log 几秒延迟),能做成这么高性能?
有点好奇这种常用功能是怎么实现的。
1
leoleoasd 2021-04-03 12:10:53 +08:00
假设有个 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) |
2
leoleoasd 2021-04-03 12:11:01 +08:00
不一定完全对,大概这个样子
|
3
leoleoasd 2021-04-03 12:11:49 +08:00
稍微改一下就可以查 “有指定 5 个 tag 中 3 个或以上的” 图片等高级搜索
|
4
Nillouise OP @leoleoasd 这样性能上能满足要求吗?看着功能确实是可以这样实现的,但 pixiv 少说也有 10 个 tag 以上,后面的子查询可以查出 10w 的 image_id,我有点怀疑能不能在 1s 内返回。
不过如果分库分表+很多个读副本的话,应该也能提高很多性能吧,看起来之前我有点思维误区了。 |
6
Soar360 2021-04-03 13:26:47 +08:00
pgsql 的 gin 倒排索引了解下?
|
7
eason1874 2021-04-03 13:29:36 +08:00
MySQL 能做,用 MySQL 的 WordPress 不就可以这样么。
图片跟文章一样在 posts 表,标签在 terms 表,图片和标签的关系在 relationships 表。 relationships 表有 post_id 和 term_id,连表查询就行了,单标签多标签都一样查,我做过,只是当时数据少,不知道数据多了性能怎么样。 |
8
superrichman 2021-04-03 14:51:56 +08:00 via iPhone
搞张中间关系表就能做了
|
9
dd112389 2021-04-03 16:09:16 +08:00
三张表, 用表连接查, 不用子查询.
建立合适的索引, 连接查询能缩小范围的条件写前面. (最好先查询小表). |
10
moen 2021-04-03 16:44:57 +08:00 1
在某个 pixiv 员工的[基础设施介绍]( https://speakerdeck.com/konoiz/pixivniokerumysqlyun-yong-falseshi-ji?slide=13)里可以看到他们搜索是用 Solr 来实现的
|
11
SjwNo1 2021-04-03 17:42:14 +08:00 via iPhone
如果用中间表的话,此表膨胀速度太快了~
|