SQL的N+1问题与sqlite

SQLite 与 N+1 问题

什么是 N+1 问题?

N+1 问题通常发生在当你需要从数据库中获取关联数据时. 假设需要获取一个作者列表以及每位作者的文章列表. 如果先执行一个查询获取所有作者(N), 然后对于每个作者, 再执行一个单独的查询来获取他们的文章(+1), 那么就会产生N+1问题.

进入阅读→

SQLite 数据库备份全攻略

数据备份的重要性不言而喻. 对于轻量级数据库 SQLite 来说, 备份操作更是至关重要. 本文将深入探讨 SQLite 数据库的多种备份方法, 并分析它们的优缺点.

SQLite 的魅力之一在于其数据存储在一个单一文件中. 在理想情况下, 可以直接复制该文件进行备份. 然而, 现实情况往往更加复杂. 本文逐一了解各种备份方法, 并提供清晰的代码示例.

在开始之前, 先使用 time 命令来衡量各种备份操作的耗时, 以便更直观地比较它们的效率. (注: 以下所有命令示例均以 time 命令开头, 用于记录执行时间.)

进入阅读→

SQLite的窗口函数

你是否还在用传统的 GROUP BY 进行复杂的数据分析? 是时候认识一下 SQL 窗口函数 (Window Functions) 了! 窗口函数是一种强大的 SQL 功能, 它能让你在不减少行数的情况下, 对数据集的窗口(一组相关的行)执行计算, 极大地提升数据分析的灵活性和效率.

窗口函数的基本概念

窗口函数的语法结构如下:

进入阅读→

使用SQLiteFTS5扩展实现全文检索

本文将介绍如何使用 SQLite 的 FTS5 (Full-Text Search 5) 扩展, 为您的电影评论应用添加高效的电影标题搜索功能. 如果您正在使用 SQLite 并且需要实现全文搜索, 那么 FTS5 绝对是您的理想选择.

使用 LIKE 运算符的性能问题

假设您已经有了一个电影数据库, 并且想要根据电影标题进行搜索. 最先想到的方法可能是使用 SQL 的 LIKE 运算符. 例如, 您可以使用以下查询来查找标题包含 "Star Wars" 的电影:

进入阅读→

SQLite 数据类型

SQLite 在数据类型上显得格外特立独行.

先来看一个创建表的 SQL 语句:

CREATE TABLE contacts (
    name TEXT,
    age INTEGER
);
进入阅读→

homebrew的原理以及使用

Homebrew由开发者 Max Howell开发开源包管理工具,是当前(2022年)osx上最方便的包管理器工具。

Homebrew 早期仅有macOS版本,现在也可以进行Linux包管理.

可以一键安装开源免费的命令行以及图形界面应用. 使用体验接近apt, yum之类的Linux包管理工具.

进入阅读→

nginx+RMTP配置直播推拉流服务实践

此方案比较成熟,但是新手未必能一步到位,作为实践记录保存

基础服务

  • 安装nginx(下面是包管理器安装,比较推荐源码安装)
进入阅读→

Emacs的使用程度

superman

试用

知道有Emacs这么个东西, 下载试用下下, 学会了 C-x C-c 可以退出Emacs, C-h t 可以进入教程, 像试用简单的文本编辑器一样用鼠标和键盘编辑文件.

进入阅读→

避免在sqlite项目中使用连接池

使用luminus项目模版创建的项目中, 默认都是使用HikariCP来创建一个有10个connection的连接池.

这在其他类型的数据库上很合理, 在sqlite上却有些多余, 而且数据库有长时间闲置连接回收创建的机制, 在挂载多数据库的时候需要反复检查挂载.

如果漏掉就会抛出异常.

进入阅读→

re-frame,reitit-frontend路由里传参

背景

最近的项目都用kee-frame,在controller中处理访问时url里的参数,大致会是下面这个样子,

(require '[kee-frame.core :as kf])
(kf/reg-controller
 :broadcast/room-detail-controller
 {:params (fn [route]
            (let [path  (get-in route [:path-params :path])
                  query (get route :query-string)]
              (when (and (= path "/broadcast/room-detail") (re-find #"id=\w+" (or query "")))
                (second (string/split query "=")))))
  :start  (fn [_ id]
            [:broadcast/broadcast-detail-ajax id])
  :stop (fn []
          [::reset])})
进入阅读→