@老虎会游泳,那个博主给出新的解决方案了,速度上确实应该会很快,但空间占用也很恐怖。。
更改表结构和建立索引
那个博主新的表结构为:
CREATE TABLE 闭包表 ( 祖先 INT, 后代 INT, 距离 INT, PRIMARY KEY (后代, 距离), KEY (祖先, 距离) );
使得有如下两种索引:
- 聚集索引:
(后代, 距离, 祖先)
- 二级索引:
(祖先, 距离, 后代)
就能高效应对下列查询了:
- (孙)子/后代节点:走二级索引
(✔查询节点, ✔1 或 2 或 任意, ❓<要获取的后代节点>)
- (祖)父/祖先节点:走聚集索引
(✔查询节点, ✔1 或 2 或 任意, ❓<要获取的祖先节点>)
下列查询会小范围扫表,但问题不大:
某后代节点与某祖先节点的距离:走聚集索引
(✔查询后代节点, ❓<要获取的距离>, ❌查询祖先节点)
只要
查询后代节点
层级没有深到离谱,扫表范围也就连续的几行几十行而已。占的空间太大了,怀疑性价比
一个 66W 的 5 级地区表,就要配套一个相当于 780W 的闭包表,快接近 12 倍于主表的辅助表了。。
如此恐怖的空间换时间方案,到底能快多少呢?真的值得投入这么多空间来提速吗?
图2挂了,这里![]()
@无名啊,大佬能不能细说一下你上面的命令,命令不怎么熟有点看不懂,主要是我其实更习惯用管道这样的方式<<这样定向的方式我看不太懂
如上图,我输出所有数组能得到下图这样,当然加了个nl命令
但是当我单拧出来一个数组,那么结尾就会有一个换行🤣🤣![]()
@无名啊,没呢我闲着写的,用的git上的网易云音乐api,想写个实现本地化命令行的一些操作,读取本地json是不想一直都向api请求。哈哈🤣🤣
@庸人,你的需求是要备份当下的网易云歌单吗?还是啥。。
@无名啊,其实就是将name→歌曲名和id又歌曲id放进两个数组变量里🤣。
因为我看jq就是按行输出的,所以想到有没有办法直接放进数组里而不用再去循环遍历一次。后面要用了就直接调用数组了
@庸人,你说下原始需求,感觉会有更好的实现方式
@无名啊,感谢大佬么么,其实我用的就是bash,,只是很不熟,太菜了
之前看到过这个不过我在termux终端测试输入没有高亮我以为不支持🤣🤣
@庸人,比如:
$ readarray -td $'\0' arr < <(jq -rj '[.[].name] | join("\u0000")' <<<'[{"id": 1, "name": "a\nb\n"}, {"id": 2, "name": "c\nd"}]') $ declare -p arr declare -a arr=([0]=$'a\nb\n' [1]=$'c\nd')
如果你不担心你的
name
里有换行符的话,可以直接:$ readarray -t arr < <(jq -r '.[].name' <<<'[{"id": 1, "name": "ab"}, {"id": 2, "name": "cd"}]') $ declare -p arr declare -a arr=([0]='ab' [1]='cd')
@庸人,直接回答:可以用
Bash
的readarray
来一次性读到某个数组另外:
Bash Shell
更适合交互式和简单脚本使用。含有数组、字典甚至更复杂数据结构的,可能都值得你考虑换其他语言了- 不想换的话,考虑尽量用
jq
来一次性生成你最终要的数据?
@无名啊,格式就是这样(图下),我主要取出元素playlist下面的所有name元素数组(.playlist[].name),然后有没有办法直接将其结果赋给脚本内变量数组(不想每次都调用),我下图用的循环取出方法,有没有更简单的
。![]()
@童真再见,最常见的原因是压缩包解压时乱码。当然也可能是程序创建中文文件夹名时乱码。
@无名啊,我替换文件时发现的
手机
@TabKey9,那个估计不行,我这个就只发图片,再做个人物介绍一类的,现在再测试typecho,还不错
看路径,有点像谷歌浏览器的(用户)设置数据及缓存文件夹。但又没挂在谷歌的目录里,怪
虎友高配版(绿色)
我手机里也有类似的文件名,不知道是什么
@晨曦,没有,年中才续费上
zb Typecho
我是晨曦,我喂自己袋盐!