如何用 SQL 求出「都关注了某100人」和「都收藏了某100帖子」的所有用户?
@老虎会游泳,可如果你去看下『多值索引』的底层存储,发现还是关系数据库。。
这里有个解析:https://zhuanlan.zhihu.com/p/115802841
发现还是展开来存。。比如 (id: 1, has: ["aa", "bb"]) 就存成 ("aa" -> 1)("bb" -> 1)。。
估计这也解释了为何一个索引,不能有多个多值字段吧(否则就数量爆炸了:一行记录,对应 count(多值字段一) * count(多值字段二) * ... 行索引)
我不这么认为。
你瞅了刚才发的那篇文章地址了吗?别人分析了多值索引底层存储结构:
原表:
[root@yejr.me]> select id, custinfo->'$.zipcode' from customers;
+----+-----------------------+
| id | custinfo->'$.zipcode' |
+----+-----------------------+
| 1 | [94582, 94536] |
| 2 | [94568, 94507, 94582] |
| 3 | [94477, 94507] |
| 4 | [94536] |
| 5 | [94507, 94582] |
+----+-----------------------+
二级索引的底层存储:
+---------+------+
| zipcode | id |
+---------+------+
| 94477 | 3 |
| 94507 | 2 |
| 94507 | 3 |
| 94507 | 5 |
| 94536 | 1 |
| 94536 | 4 |
| 94568 | 2 |
| 94582 | 1 |
| 94582 | 2 |
| 94582 | 5 |
+---------+------+
@老虎会游泳,我测试了下,Python 生成 1KW 个数字(0~1KW-1),然后变成 json 字符串,给 sqlite 计算出 min、max、count,
我的渣笔记本用时 3 秒
结果: