GreatSQL分页查询优化案例实战

一次实时数据链路丢数排查:从 MQTT 队列积压到 SQL 统计开销 本文通过一次实时数据链路压测,排查了从MQTT到ClickHouse的端到端数据丢失问题。核心方法是为每条消息添加序号,建立独立观察点(MQTT订阅端、Kafka消费者),结合转发服务阶段统计与线程栈分析,定位到下游处理速度不足源于Druid SQL合并统计的高开销。优化措施包括关闭SQL合并、扩容代理队列、增强生产侧失败处理,并验证15分钟内实现全链路对账一致,显著缓解积压与丢包。关键收获:数据可对账、明确各阶段“成功”定义、关注客户端队列状态。 阅读详情

GreatSQL分页查询优化案例实战

导语

随着国产化替代的深入,很多 Oracle 数据库迁移到 GreatSQL 上,GreatSQL 也做了大量的 Oracle 语法兼容,以减少国产化改造工作。

本文说一下 Oracle 的分页查询语句迁到 GreatSQL 上来的表现以及如何用 GreatSQL 实现高效分页查询。

SQL 案例

SQL语句

SELECT *
  FROM (SELECT t.*, ROWNUM rn
          FROM (SELECT * FROM t_pagequery ORDER BY log_time DESC) t
         WHERE ROWNUM <= 10)
 WHERE RN > 0

语句分析

这是 Oracle12c 以前典型的分页查询的写法,借助 ROWNUM 伪列的三层嵌套查询。因为 ROWNUM 是对结果集加的伪列,是先有结果集,返回给客户端时加上去的一个列。

如果在最内层查询上加上 ROWNUM 条件(SELECT * FROM t_pagequery WHERE ROWNUM<=10 ORDER BY log_time DESC),这样的效果是先取10行再排序,不是先排序再取10行,要对排序后的结果集取前10行,需要将ROWNUM放在第二层。因为 ROWNUM 是结果集的序号,不能用大于的条件,所以只能在第二层对其起别名,再套一层查询对别名施加大于的条件实现分页查询。

说实话,Oracle 这种写法,还挺复杂的,GreatSQL 原生的分页查询写法就相对简单了,只需一层查询即可实现。

SELECT t.* FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;

GreatSQL 的 LIMIT 子句不是 WHERE 条件,对查询结果的一个分页截取。如果非要跟 Oracle 对标,把序号加上,需要使用 ROW_NUMBER 窗口函数。

SELECT t.*,ROW_NUMBER() OVER() rn FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;

需要注意的一点,GreatSQL 的 sql_mode 如果设置为 Oracle 模式,会导致上面的查询无法使用索引排序。

据研发人员解释 Oracle 的索引与 GreatSQL 有所不同,Oracle 的普通索引,如果索引列的数据都是 NULL 值,不会放在索引树上,而 GreatSQL 上没有这个限制,即使都为 NULL,也可以存放在索引树上,因为 GreatSQL 的索引结构中除了存储索引列信息,还存储了主键信息。另外Oracle的默认排序是把NULL值放在后面,而 GreatSQL 的默认排序是把 NULL 值放在前面。基于索引结构与排序方式的不同,GreatSQL 在兼容 Oracle 的模式时,没有用索引排序。

GreatSQL 对 Oracle 的 ROWNUM 函数语法做了兼容,在 Oracle 上执行的分页查询语句,在 GreatSQL 上执行是完全没有问题的,但是 ROWNUM 函数的使用也会导致无法使用索引排序,小表使用文件排序也没有性能问题,遇到百万千万级大表时性能问题会显现,此时要将 Oracle 分页查询的写法,改为 GreatSQL 原生的分页查询,来提升性能。

实验验证

下面通过实验验证上面的结论。

创建测试表,插入10万行测试数据。

CREATE TABLE t_pagequery(id NUMBER(10) PRIMARY KEY,
log_time DATETIME,
c1 VARCHAR(10),
key idx_logtime(log_time)
);

SET sql_mode=Oracle;
DELIMITER //
CREATE OR REPLACE PROCEDURE p1() IS
BEGIN
  FOR i IN 1..100000 LOOP
    INSERT INTO t_pagequery(id,log_time,c1) VALUES(i,SYSDATE-RAND()*1000,'a');
  END LOOP;
END;
//
DELIMITER ;

CALL p1;

1.验证 Oracle 分页写法与 GreatSQL 原生分页写法的结果集是一致的。

greatsql> SELECT *
    ->   FROM (SELECT t.*, ROWNUM rn
    ->           FROM (SELECT * FROM t_pagequery order by log_time desc) t
    ->          where ROWNUM <= 10)
    ->  WHERE RN > 0;
+-------+---------------------+------+------+
| id    | log_time            | c1   | rn   |
+-------+---------------------+------+------+
| 24513 | 2025-07-11 11:08:19 | a    |    1 |
| 78625 | 2025-07-11 11:06:48 | a    |    2 |
| 96674 | 2025-07-11 10:39:17 | a    |    3 |
| 57955 | 2025-07-11 10:30:58 | a    |    4 |
| 41217 | 2025-07-11 10:30:51 | a    |    5 |
| 34115 | 2025-07-11 10:22:08 | a    |    6 |
| 39214 | 2025-07-11 10:19:31 | a    |    7 |
|  2032 | 2025-07-11 10:12:18 | a    |    8 |
|  7805 | 2025-07-11 09:53:12 | a    |    9 |
| 74703 | 2025-07-11 09:44:34 | a    |   10 |
+-------+---------------------+------+------+
10 rows in set (0.14 sec)

greatsql> SELECT t.*,ROW_NUMBER() OVER() rn FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;
+-------+---------------------+------+----+
| id    | log_time            | c1   | rn |
+-------+---------------------+------+----+
| 24513 | 2025-07-11 11:08:19 | a    |  1 |
| 78625 | 2025-07-11 11:06:48 | a    |  2 |
| 96674 | 2025-07-11 10:39:17 | a    |  3 |
| 57955 | 2025-07-11 10:30:58 | a    |  4 |
| 41217 | 2025-07-11 10:30:51 | a    |  5 |
| 34115 | 2025-07-11 10:22:08 | a    |  6 |
| 39214 | 2025-07-11 10:19:31 | a    |  7 |
|  2032 | 2025-07-11 10:12:18 | a    |  8 |
|  7805 | 2025-07-11 09:53:12 | a    |  9 |
| 74703 | 2025-07-11 09:44:34 | a    | 10 |
+-------+---------------------+------+----+
10 rows in set (0.00 sec)

从上面查询的执行时间来看,GreatSQL原生的写法耗时0.00s,性能更好。

2.非 Oracle 模式下,查询一下执行计划。

greatsql> SELECT @@sql_mode;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                                                       |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

greatsql> explain
    -> SELECT *
    ->   FROM (SELECT t.*, ROWNUM rn
    ->           FROM (SELECT * FROM t_pagequery order by log_time desc) t
    ->          where ROWNUM <= 10)
    ->  WHERE RN > 0;
+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+----------------+
| id | select_type | table       | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra          |
+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+----------------+
|  1 | PRIMARY     | <derived2>  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 100406 |    33.33 | Using where    |
|  2 | DERIVED     | <derived3>  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 100406 |   100.00 | Using where    |
|  3 | DERIVED     | t_pagequery | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 100406 |   100.00 | Using filesort |
+----+-------------+-------------+------------+------+---------------+------+---------+------+--------+----------+----------------+
3 rows in set, 1 warning (0.00 sec)

greatsql> explain SELECT t.*,ROW_NUMBER() OVER() rn FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;
+----+-------------+-------+------------+-------+---------------+-------------+---------+------+------+----------+---------------------+
| id | select_type | table | partitions | type  | possible_keys | key         | key_len | ref  | rows | filtered | Extra               |
+----+-------------+-------+------------+-------+---------------+-------------+---------+------+------+----------+---------------------+
|  1 | SIMPLE      | t     | NULL       | index | NULL          | idx_logtime | 6       | NULL |   10 |   100.00 | Backward index scan |
+----+-------------+-------+------------+-------+---------------+-------------+---------+------+------+----------+---------------------+
1 row in set, 2 warnings (0.01 sec)

Oracle 分页查询的写法,在 GreatSQL 上执行,虽然只取前几行数据,却需要会对表进行全表扫描,再进行filesort,如果是个千万级别的大表,代价是很大的。而GreatSQL原生写法,使用了"Backward index scan",倒序扫描索引10行就可以了,显然这种效率更高效。

3.Oracle 模式下,GreatSQL 原生写法的执行计划。

greatsql> SET sql_mode=Oracle;
Query OK, 0 rows affected (0.00 sec)

greatsql> SELECT @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                                                              |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,Oracle,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

greatsql> explain SELECT t.* FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------+
|  1 | SIMPLE      | t     | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 100406 |   100.00 | Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

Oracle模式下,GreatSQL原生写法也用不上索引,从Oracle迁移过来的系统,为了更好的兼容Oracle语法,一般是要开启Oracle模式的,那为了使用索引排序,可以在语句级别加hint设置sql_mode来解决,随便指定一个sql_mode即可,但不能设置成空串。

greatsql> explain SELECT /*+ set_var(sql_mode='ONLY_FULL_GROUP_BY') */  t.*,row_number() over() FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;
+----+-------------+-------+------------+-------+---------------+-------------+---------+------+------+----------+---------------------+
| id | select_type | table | partitions | type  | possible_keys | key         | key_len | ref  | rows | filtered | Extra               |
+----+-------------+-------+------------+-------+---------------+-------------+---------+------+------+----------+---------------------+
|  1 | SIMPLE      | t     | NULL       | index | NULL          | idx_logtime | 6       | NULL |   10 |   100.00 | Backward index scan |
+----+-------------+-------+------------+-------+---------------+-------------+---------+------+------+----------+---------------------+
1 row in set, 2 warnings (0.00 sec)

greatsql> explain SELECT /*+ set_var(sql_mode='') */  t.*,row_number() over() FROM t_pagequery t ORDER BY log_time DESC LIMIT 0,10;
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------+
|  1 | SIMPLE      | t     | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 94474 |   100.00 | Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------+
1 row in set, 3 warnings (0.00 sec)

再提及一点细节,Oracle的普通索引,如果索引列都是NULL值,则不会存储在索引Tree结构中。而GreatSQL没有这个限制,所以我在建测试表时并没有指定索引列log_time带NOT NULL约束,照样用上了索引排序。而Oracle如果这样建表则不会使用索引排序,Oracle要么有非空约束,要么语句中加条件IS NOT NULL,要么与其他NOT NULL列或常数列建联合索引,才能用上索引排序。这一点上来看GreatSQL处理起来还是有优势的。

总结

  1. Oracle的分页查询借助ROWNUM做三层嵌套查询,GreatSQL的原生分页查询是使用LIMIT子句,GreatSQL虽然兼容Oracle这种分页查询语法,却无法使用索引排序,小表没有问题,但是对百万千万级别的大表,使用文件排序会很耗资源,需要改成GreatSQL原生的写法来提升效率。
  2. GreatSQL的sql_mode为Oracle模式时,无法使用索引排序,需要用hin语句级别指定sql_mode来解决,注意不能指定成空串。
  3. GreatSQL的二级索引中会存储索引列都为NULL的数据,在使用索引排序时,不用考虑带着索引列条件IS NOT NULL或者加非空约束。
51雾化器实现 1. 雾化器简介 雾化器是将试液雾化的一种器械。雾化器是原子化系统的重要部件,其性能对测定的精密度和化学干扰等产生显著影响。因此要求雾化器喷雾稳定、雾滴细小、均匀和雾化效率高。雾化器的类型有超声雾化器,空气压缩式雾化器,网式雾化器。超声雾化器因其价格合适,适合家用,被广泛应用于加湿器,香薰机等各种小家电,也在医疗领域有很多的应用。家用雾化器的主要器件是一枚雾化片。 家用雾化器分为两种不同类别雾化片,实孔雾化片和微孔雾化片,这两种的喷雾方法和工作原理是有所不同的。不同的雾化片需要特定的频率才能工作。 实孔雾 阅读详情

相关推荐

密码子偏好性分析实战指南:从codonW到EMBOSS-CUSP的完整流程解析

本文详细解析了密码子偏好性分析的完整流程,从基础概念到实战操作,涵盖codonW和EMBOSS-CUSP工具的使用技巧。通过RSCU、ENC、CAI等关键参数分析,帮助研究者理解基因表达调控规律,优化外源基因表达效率,适用于分子生物学和合成生物学研究。

weixin_33737774的博客 572

GreatSQL 分页查询优化案例实战

Oracle 的分页查询借助 ROWNUM 做三层嵌套查询,GreatSQL 的原生分页查询是使用 LIMIT 子句,GreatSQL 虽然兼容 Oracle 这种分页查询语法,却无法使用索引排序,小表没有问题,但是对百万千万级别的大表,使用文件排序会很耗资源,需要改成 GreatSQL 原生的写法来提升效率。GreatSQL 的 sql_mode 为 Oracle 模式时,无法使用索引排序,需要用 hin 语句级别指定 sql_mode 来解决,注意不能指定成空串。

ascagasaaxsa的博客 465

【XR技术介绍】深度解析|AI眼镜核心技术架构:从硬件层到端云AI全链路拆解

本文将逐层拆解AI眼镜完整技术架构,梳理硬件、感知、光学、端侧AI、软件云端五大核心层级,剖析核心数据流与行业技术瓶颈,同时附上标准化技术架构图,适合技术学习、方案汇报、行业科普使用。

houdou112358的博客 435

SQL并行执行的机制解析与计划调控实践

并行执行是大数据量场景的核心提速手段,但用错代价极高。本文从问题边界讲起,梳理并行度的确定层级、优化器生成并行计划的逻辑、数据再分布与通信代价、倾斜成因与识别方法,覆盖表设计、索引策略、并行DML、RAC调度与参数取舍,配合三个真实失败案例与诊断步骤,给出一套可落地的并行治理流程与误区清单。

搞定过:百亿级数据、万级QPS、零宕机、AI工业化。 778

zemax双透镜公差分析

蒙特卡罗分析: 评估公差的整体影响,模拟过程中产生一系列随机的lens,满足指定的公差,然后再按照标准评估。公差分析,就是在设计了一个理想的系统后,想看看实际生产过程中如果产生公差(误差),系统会坏到什么程度,也就是光学性能受到多大影响。反灵敏度分析:分别对每个公差在性能方面的一个给定的最小允许减少量来计算公差,也就是限制了系统性能的变化,和灵敏度分析方向相反。灵敏度分析对每个公差单独求值,分别计算每个公差操作数的最大、最小、标准值(如上图)所有设计上可能的公差都列出来了。注意要固定透镜的口径。

fendoudecheng的博客 3207

Ubuntu断网环境下的系统更新:apt-offline保姆级教程(附常见问题排查)

本文详细介绍了在Ubuntu断网环境下使用apt-offline进行系统更新的完整教程,包括环境准备、签名文件生成、数据传输方案对比及常见问题排查。特别适用于企业级开发环境或安全敏感场景,帮助运维人员高效完成离线系统更新,确保系统安全与稳定。

weixin_29214691的博客 360

Flink SQL 连接器实战:MySQL Source、Flink CDC 与 JDBC Sink 全解析

提供有界流读取,适合批处理和维表场景,简单直接但无法感知变更。MySQL CDC提供无界流读取,通过「全量快照 + binlog 增量」的方式实现实时捕获,是实时数仓的核心入口,但需要 MySQL 侧正确配置 binlog 和权限。JDBC Sink负责结果回写,关键在于区分仅插入流和更新流,更新流必须依赖主键完成 upsert。掌握这三者的差异,本质上就是掌握了 Flink 中「有界与无界」「追加与更新」这两组最基本的语义。

2401_83857914的博客 455

TDSQL-单机安装

根据腾讯云官方要求,TDSQL安装至少需要三台机器。本人想要学习TDSQL但是没有足够的机器资源,经过仔细分析研究TDSQL安装过程,尝试发现单台机器也可以成功安装TDSQL,现将本人单台机器安装TDSQL的过程以及安装过程中遇到的问题在此分享。具体安装过程可参考腾讯官方文档,本文仅分享与官方文档不一致的步骤。

u012607648的博客 6808

云数仓向PostgreSQL生态延伸的技术动因与工程代价

Snowflake以2.5亿美元收购Crunchy Data,把云数仓的触角伸向PostgreSQL生态。本文从负载补齐、元数据标准化与AI应用低延迟读写三个切面拆解收购动机,逐层分析列存与行存的能力边界、存算分离下引入事务负载的提交延迟预算、逻辑复制的接缝风险、元数据统一与混合负载隔离冲突,并给出迁移落地的分阶段验收清单与七个典型误区,最后提供评估厂商PostgreSQL能力的六项观察指标。

搞定过:百亿级数据、万级QPS、零宕机、AI工业化。 447

BDD测试用例:Playwright的MCP Server实战

Playwright MCP Server建立了大模型和真实的浏览环境之间的桥梁,可以让大模型操作多款浏览器完成测试任务。

Criss@陈磊 450

寻路最终版哦

相信大家用unity3d寻路的时候,一定会碰到多人

yxriyin的专栏 6955

记一次Sql Server2012免费版如何升级到2016企业版本

本文记录了将SQL Server 2012免费版升级至企业版的完整流程,重点解决因版本限制导致无法使用代理功能的问题。通过加载ISO安装包,选择从旧版本升级,完成功能安装与实例配置后,需手动启用“代理XP”并检查服务状态。若代理仍异常,需通过安装程序添加“SQL Server代理”组件,最终实现企业版功能完整启用。

qq_57492774的博客 200

STM32CubeMX之emWin移植

“前面两章介绍了SDRAM和LTDC的使用,本篇文章将介绍emWin移植到STM32。”硬件环境:STM32F429IGT6软件环境:STM32CubeMX v5.5.0...

zhang062061的专栏 2826

PostgreSQL 日报| OAuth 校验库置空仍可登录(11 月 9 日)

Tomas Vondra 提交了针对 commit a798660ebe3 中"bogus parameterizations"漏洞的清理版修复补丁,并为各个回退分支分别提供了对应的版本。据报道,OpenAI 正在进行新一轮融资,已额外筹集 110 亿美元,整轮融资尚未正式收官,预计将在未来数周内完成。作为一款面向现代开发流程的 Serverless Postgres 数据库,Lakebase 支持即时分支与环境克隆,并通过计算与存储分离的架构提升性能、降低成本、增强可靠性。函数中发现了一个 bug。

IvorySQL的博客 237

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SQL Server 基础语法详解:从建库建表到约束与增删改查

本文以学生信息表 Students 为主线,系统讲解数据库基础语法,涵盖建库、建表、约束添加及增删改查操作。通过 SQL Server T-SQL 示例,清晰区分数据库、表结构与记录的操作对象,强调字段类型、非空、自增、主键、唯一、检查与默认约束的定义与应用,帮助读者理清各语句间的逻辑关系,掌握数据库管理的核心技能。

2601_96519735的博客 940

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

XSS 过滤器 vs SQL 注入防护:自动化测试平台中的

通过分析 AutoTest Platform 的源码可以看出,在实际开发中合理运用字符转义、参数化查询和白名单策略能够有效减少 Web 安全风险。对于非科班出身或刚刚入门的技术人员来说,理解这些安全措施的具体实现方式是非常重要的一步。建议读者可以尝试以下几个方向深入学习:1. 学习 Jsoup 库及 Whitelist API 的用法,并尝试自定义一套适用于自身项目的 HTML 清理规则;

后台模板 236

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

智能问数(Text2SQL)的两大方案及实施成本

现在流行挂个 RAG 知识库,把表结构、字段名、业务术语全向量化存起来,每次查询时现去检索相关片段喂给大模型。只做一件事,把口语化的自然语言转成有规则的自然语言,也就是“规范文本”。然后规则引擎根据预先配置好的业务词典和映射规则,把规范文本编译成 100% 准确的 SQL。核心工作量在配置业务词典,把用户爱说的“华北区”“在途订单”这些词,跟数据库表和字段对上。关键是,规则是写死的、确定的。SQL 怎么生成、逻辑怎么组合,全都写在规则里。出了问题,查规则、改词典、补映射,改完就知道对不对,没有不确定性。

Raqsoft 157

sqlsugar入门

sqlsugar入门

bjzhang75的博客 237

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 214

网站的SQL 注入:从攻击原理到防御措施

SQL 注入(SQL Injection)是 Web 应用中最古老、危害最大的安全漏洞之一。简单来说就是攻击者通过在用户输入中注入了恶意的SQL 代码,让数据库执行非正常的操作,从而能窃取数据、篡改内容甚至控制整个服务器。SQL 注入虽然古老,但至今仍是 Web 安全的头号威胁。永远不要把用户输入直接拼进 SQL 语句。首选:使用 PDO/MySQLi 预处理语句 + 关闭模拟预处理配合:输入类型校验与格式验证加固:数据库最小权限 + 关闭错误回显外围:WAF + 定期安全扫描。

2501_94567985的博客 418

01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入

01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入 系列定位 :《SQL Server 数据库全栈运维实战系列》第 01 篇,与《MySQL 数据库全栈运维实战系列》同构对标(对标 MySQL 01 对应篇目)。 适用版本 :SQL Server 2019/…

dk843108982的博客 188

快捷键与热键有何异同?

本文对比了热键与快捷键在“粘贴”操作中的异同:用户层面,热键需按Alt+字母组合,快捷键则直接Ctrl+V;开发者层面,修改热键仅需调整菜单标题,而修改快捷键需编辑资源文件中的加速器设置。文章强调专业分工的重要性,并推荐相关排样优化与工具箱技术博文。

闻缺陷则喜何志丹 1746

SQL Server 增删改查与约束全解:INSERT/UPDATE/DELETE、LIKE 模糊查询、主外键约束

看着简单,但delete和truncate的区别、where漏写、null判断、like通配符、约束命名,每一处都能让新手卡半天。文末给出 WinForm 连接 SQL Server 的完整写法。

2501_94699871的博客 178

SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写

SonnetDB 5.0 正式发布,系统介绍相对 4.0 的 SQL、事务、精确类型、九模型 MCP、.NET 接入、查询优化、可靠性修复与升级步骤。

麦壳饼 359

PostgreSQL 日报| pg_basebackup 提速至 23Gbps(11 月 5 日)

这一案例展示了按需、可弹性扩展的数据库供给如何满足 AI 辅助开发场景的需求,也说明 Neon 在多智能体与多用户并…Neon 的实际使用数据显示,AI agent 在选择工具时,即便内部逻辑建议使用 CLI,仍会优先选择 MCP server。然而,批评人士指出,该倡议同样服务于 OpenAI 自身的商业利益,意在将公司议程嵌入重大选举周期前的政治生态。用户可将其与平台上 70 余个其他模型配合使用,直接调用 Lakehouse 中的现有数据,构建受治理的 AI 应用与智能体。每个哈希条目存储两个有…

IvorySQL的博客 235

PG18 索引与查询特性在 IvorySQL5.6 上的实测

这一篇测 IvorySQL 5.6(PG18) 在索引与查询侧的三组新能力:nbtree 的 skip scan、GIN 索引的并行构建、以及控制文件复制方式的。

IvorySQL的博客 232
上一篇: 技术干货 | 如何将大表在线改造为分区表并释放空间
下一篇: MySQL迁移至GreatSQL后,timestamp字段插入报错解析
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值