分类: 编程

  • MySQL多层级树形结构表的搜索查询优化

    MySQL多层级树形结构表的搜索查询优化

    业务中有思维导图的功能,涉及到大量的树形结构搜索、查询相关的功能,使用场景上查询量远高于增删改操作,记录一下当前的解决方案。

    一、表结构

    简化的表结构类似

    create table nodes (
      id int primary key auto_increment,
      name varchar(255) not null default '' comment '节点名称',
      parent_id int not null default 0 comment '上级节点',
    
      index nodes_parent_id_index (parent_id),
      index nodes_name_index (name)
    );
    

    二、当前解决方案

    更新表结构:

    -- 添加字段
    alter table nodes add column path text not null comment '节点路径';
    
    -- 创建索引
    create index nodes_path_index on nodes(path);
    
    -- 更新历史数据
    update nodes current
    left join nodes parent on current.parent_id = parent.id
    set path = ifnull(concat(parent.path, ',', current.parent_id), '0');
    
    -- 插入更新后执行
    update nodes current
    left join nodes parent on current.parent_id = parent.id
    set path = ifnull(concat(parent.path, ',', current.parent_id), '0');
    where current.id = 198;
    
    -- 级联删除
    delete from nodes where id = 198;
    delete from nodes where (path like '0,5,198,%' and parent_id = 198);
    

    1. 查询ID为“5”的节点的所有子级、孙子级中name包含“搜索词”的记录

    更新表后的查询方式:

    -- 查询父级节点记录,获取到父级的path
    select * from nodes where id = 5;
    
    -- 通过父级path进行模糊查询
    select * from nodes where (parent_id = 5 or path like '0,5,%') and name like '%搜索词%';
    

    可以创建一个触发器,在插入、修改数据时,更新子级的path。

    2. 查询ID为“5”的节点的所有父级

    -- 获取当前节点
    select * from nodes where id = 5;
    
    -- 使用当前节点的path查询所有父级
    select * from nodes where find_in_set(id, '0,5');
    
    -- 或者也可以使用in
    select * from nodes where id in (5);
    

    因为有缓存,所以都尽量使用的简单查询,不使用缓存可以使用子查询。

  • 使用WordPress作为小程序后端——APPID有效性前置检查

    使用WordPress作为小程序后端——APPID有效性前置检查

    上一篇实现了一个简单的前置检查,这一篇我们来聊一聊如何实现APPID的有效性检查。上一篇中,我们只是简单的将APPID获取到并传递到了请求处理函数中,这一篇,我们来实现一个APPID有效性的前置检查,或者叫中间件。

    APPID的检查相对比较简单,我们可以透过一种比较Wordpress的方式来实现:

    <?php
    
    add_filter('wechat_mp_permission_callback', function ($permission, WP_REST_Request $request) {
        if ($permission === false) {
            return false;
        }
    
        /**
         * @var $wechat_mp_apps
         * @example
         * [
         *     'APP_ID' => 'APP_SECRET'
         * ]
         */
        $wechat_mp_apps = apply_filters( 'wechat_mp_apps', [] );
        $attrs = $request->get_attributes();
        return array_key_exists($attrs['app_id'], $wechat_mp_apps);
    }, 10, 2);
    
  • Caddy配置CloudBeaver使用Authelia认证

    Caddy配置CloudBeaver使用Authelia认证

    Cloudbeaver反向代理认证配置文档:https://github.com/dbeaver/cloudbeaver/wiki/Reverse-proxy-header-authentication

    每个地方单独设置账号就太麻烦了,这里记录Caddy配置Cloudbeaver使用Authelia认证的方式。重点其实就是传递到后端时添加X-User和X-Team两个请求头,caddy推荐的authelia配置使用的是Remote-User和Remote-Groups。

    (更多…)
  • Parse Platform任务调度

    Parse Platform任务调度

    收起来也挺奇怪的,Parse Platform本身基于js实现,Node生态里的任务调度实现起来并不麻烦,Parse却选择了不集成,使用第三方提供的任务调度。这里使用node-cron来实现Parse Server中的Job调度。

    (更多…)
  • 在electron中基于容器和服务提供者扩展应用核心能力

    在electron中基于容器和服务提供者扩展应用核心能力

    应用自身可能提供多种不同的能力,结合服务提供者概念和容器,我们可以实现类似插件的扩展机制,并且通过容器来统一管理服务对象,方便后续扩展。

    (更多…)
  • 创建strapi插件

    创建strapi插件

    需要开发一个插件来实现一些自定义功能,官方文档写的实在是难以理解了。

    (更多…)
  • 使用SSH转发服务器端口到本地

    使用SSH转发服务器端口到本地

    注意远程地址、远程端口号、本地地址、本地端口号需要按照实际情况修改。

    (更多…)

  • WordPress添加关键词和描述标签

    WordPress添加关键词和描述标签

    关键词和描述标签作为SEO的基础配置,在wordpress中没有默认添加,这里记录一下在Wordpress中自动添加关键词和描述标签的方法。

    (更多…)
  • Google Chrome扩展开发

    Google Chrome扩展开发

    Chrome扩展开发者控制台

    1. 需要支付一次性的5美元
    2. 需要使用非国内卡

    参考:

    1. Chrome开发者网站
  • Go语言获取指定年份生肖

    Go语言获取指定年份生肖

    根据给定年份,返回生肖字符串,公元前使用负值即可。(比如2022年,调用使用GetShengXiao(2022),公元前21年,调用使用GetShengXiao(-21))。

    (更多…)

  • Electron中数据持久化的选择

    Electron中数据持久化的选择

    Electron是一个基于Chromium的桌面应用程序框架,它可以让开发人员在不需要熟练掌握Web开发技术的情况下,快速地开发出高质量的桌面应用程序。在Electron中,开发人员可以使用各种各样的数据存储方式,包括文件系统、数据库等。其中,数据库是一种非常常见的数据存储方式,它可以方便地存储和管理各种数据,包括文本、图片、音频、视频等。

    (更多…)

  • Shell遍历文件夹下所有文件,并将文件内容写入一个文件中

    Shell遍历文件夹下所有文件,并将文件内容写入一个文件中

    软件著作权要求提供代码文档,这里提供使用Shell遍历文件夹下所有文件,并将文件内容写入一个文件中的方法。

    (更多…)

  • PostgreSQL常用SQL语句

    PostgreSQL常用SQL语句

    PostgreSQL与MySQL语法有一些细微差异,记录一下PostgreSQL常用的SQL语句。

    (更多…)

  • MySQL8 GTID双主配置

    MySQL8 GTID双主配置

    记录一下MySQL8中配置GTID双主的方式。

    (更多…)

  • MySQL常用SQL语句

    MySQL常用SQL语句

    记录一些常用的MySQL语句,方便查找翻阅。

    (更多…)

  • 使用微信小程序来实现扫码登录网站

    使用微信小程序来实现扫码登录网站

    微信小程序本身提供了openid等信息的无感知获取,基于此来实现微信扫码登录,主要包含以下几个步骤:

    (更多…)

  • Linux服务器的安全相关配置

    Linux服务器的安全相关配置

    记录一下Linux服务器一般常用的安全相关配置,避免被简单的黑掉,更复杂的配置暂不考虑深入研究了。

    (更多…)

  • Linux服务器Swap配置

    Linux服务器Swap配置

    简单记录文件形式的Swap使用与配置方式。

    (更多…)
  • PHP内置服务器与Serverless

    PHP内置服务器与Serverless

    PHP从5.4版本开始就提供了一个内置的WEB服务器,可以通过一个简单的命令php -S启动一个WEB服务器,极大简化了开发环境的搭建。

    (更多…)
  • Linux有线未托管问题

    Linux有线未托管问题

    今天发现在用的一个Linux开发机一直不能自动连接有线网络,显示“有线未托管”,查找测试了很多文章的解决方案都无法使用,可能更新后有了一些变化或者各自情况不同,这里记录一下个人生效的处理方式。

    sudo vim /etc/netplan/00-installer-config.yaml
    
    #文件中添加
    renderer: NetworkManager
    
    sudo netplan generate
    sudo netplan apply
    sudo reboot