TiDB 字符串行转列与 JSON 数据查询优化知识笔记

一、长字符串行转列方案

  1. JSON_TABLE 方案(TiDB 5.0+ 推荐)
    通过将逗号分隔字符串转为 JSON 数组后展开为行:

sql
SET @str = ‘a,b,c,d’;
SELECT jt.val, jt.pos
FROM JSON_TABLE(
CONCAT(‘[’, REPLACE(@str, ‘,’, ‘“,”’), ‘"]’),
[ ∗ ] ′ C O L U M N S ( v a l V A R C H A R ( 255 ) P A T H ′ [*]' COLUMNS ( val VARCHAR(255) PATH ' []COLUMNS(valVARCHAR(255)PATH’,
pos INT PATH ‘$.ordinality’
)
) AS jt;

核心原理:利用 JSON_TABLE 将数组元素映射为行,支持位置信息提取,性能接近 O (log n)。
2. 递归 CTE 方案(通用场景)
适用于无内置函数的数据库,通过递归拆分字符串:

sql
SET @str = ‘a,b,c’;
WITH RECURSIVE split_cte AS (
SELECT 1 AS pos, SUBSTRING_INDEX(@str, ‘,’, 1) AS val
UNION ALL
SELECT pos+1, SUBSTRING_INDEX(SUBSTRING_INDEX(@str, ‘,’, pos+1), ‘,’, -1)
FROM split_cte WHERE pos < LENGTH(@str) - LENGTH(REPLACE(@str, ‘,’, ‘’))
)
SELECT * FROM split_cte;
二、JSON 数据查询优化

  1. JSON 索引创建与使用
    sql
    – 为 JSON 数组元素创建索引
    CREATE INDEX idx_json ON table_name((CAST(json_col->‘$.array[*]’ AS CHAR)));

– 查询优化:直接匹配 JSON 路径
SELECT * FROM table_name WHERE json_col->“$.array[*]” = ‘target_value’;

索引优势:

时间复杂度从全表扫描的 O (n) 降至索引扫描的 O (log n)。
示例:100 万行数据查询耗时从 7.2s 优化至 6ms。
2. JSON_SEARCH 与索引对比
方法 匹配逻辑 索引支持 性能
JSON_SEARCH 搜索值并返回路径 不支持索引 O (n)(全表扫描)
->“…[*]” = value 数组元素精确匹配 支持 JSON 索引 O(log n)
三、全文索引(Full-Text Index)注意事项

  1. 版本兼容性
    TiDB 5.1+ 支持全文索引,低版本(如 v8.5.1)不支持,会报错 UnknownType: *ast.MatchAgainst。
    替代方案:使用 JSON 索引或拆分存储为关联表。
  2. 正确用法(TiDB 5.1+)
    sql
    – 创建虚拟列与全文索引
    ALTER TABLE table_name
    ADD COLUMN text_col TEXT GENERATED ALWAYS AS (REPLACE(json_col, ‘,’, ’ ')) VIRTUAL;
    ALTER TABLE table_name ADD FULLTEXT INDEX idx_text(text_col);

– 查询示例
SELECT * FROM table_name WHERE MATCH(text_col) AGAINST(‘keyword’ IN BOOLEAN MODE);
四、虚拟列(Generated Column)索引优化

  1. 创建虚拟列并加索引
    sql
    – 基于 JSON 路径创建虚拟列
    ALTER TABLE table_name
    ADD COLUMN virtual_col TEXT
    GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(json_col, ‘$.path’))) VIRTUAL;

– 添加索引
CREATE INDEX idx_virtual ON table_name(virtual_col);
2. 查询优化示例
sql
WITH split_data AS (-- 字符串拆分逻辑…)
SELECT s.id, MAX(e.paas_id)
FROM split_data s
LEFT JOIN table_name e ON e.virtual_col = s.target_value
GROUP BY s.id;

性能对比:虚拟列 + 索引查询耗时较无索引方案提升 100+ 倍。
五、常见错误与解决方案

  1. 错误 1105: UnknownType: ast.MatchAgainst
    原因:TiDB 版本 < 5.1 不支持全文索引。
    解决方案:
    升级至 TiDB 5.1+。
    改用 JSON 索引:CREATE INDEX … ON ((CAST(json_col->'$.path[
    ]’ AS CHAR)))。
  2. 索引不生效问题
    检查点:
    索引表达式与查询条件是否一致(如是否遗漏 CAST 或 JSON_UNQUOTE)。
    执行计划是否显示 IndexRangeScan(使用 EXPLAIN SELECT … 验证)。
    六、性能优化最佳实践
    数据模型优化:
    频繁查询的字符串建议存储为 JSON 数组,而非纯字符串。
    拆分存储:将逗号分隔字符串拆分为关联表(如 id-split_id 表),支持高效索引。
    索引维护:
    sql
    ANALYZE TABLE table_name; – 更新统计信息

避免反模式:
禁止 LIKE ‘%keyword%’(全表扫描),改用前缀匹配或全文索引。
减少 JSON_SEARCH 嵌套调用,直接使用 JSON 路径匹配。

总结:TiDB 中处理字符串行转列与 JSON 数据时,优先选择 JSON_TABLE + JSON 索引 方案,结合虚拟列和合适的索引类型可显著提升性能。注意版本兼容性,避免低效查询模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909908.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1 Studying《Performance Analysis and Tuning on Modern CPUs》7-11

目录 Part2. Source Code Tuning For CPU 数据驱动优化 7 CPU Front-End Optimizations 7.1 Machine code layout //机器码布局 7.2 Basic Block 7.3 Basic block placement 7.4 Basic block alignment 7.5 Function splitting //函数拆分 7.6 Function groupin…

WinUI3入门6:子线程处理UI 窗口加载后执行 获取和设置控件尺寸 自动生成事件代码框架

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

中国招聘智能化白皮书:从 “人撑不住“ 到 “AI 破局“ 的底层逻辑革命——AI得贤招聘官第六代AI面试官

一场面试&#xff0c;牵动一家公司的人力系统。 当简历数量以千计堆叠、当HR通宵挑灯刷筛选、当面试质量与效率陷入两难&#xff0c;招聘不再只是流程问题&#xff0c;而成了“组织生存”的关键变量。 问题是&#xff1a;靠人&#xff0c;已经撑不住了。 企业招聘正步入前所…

防爆型激光测距传感器:危险环境中的安全守护者

在石油化工、煤矿开采、核电站等高危工业场景中&#xff0c;爆炸性气体与粉尘的存在让传统测量设备望而却步。而防爆型激光测距传感器的出现&#xff0c;犹如为这些领域注入了一剂“安全强心针”&#xff0c;以毫米级精度与防爆双重保障&#xff0c;重新定义了工业测量的安全边…

【AI编程】PC的一个提示词,生成网站首页,模型gpt4.1 、deepseekv3和claude3.7对比,你更喜欢哪个?

AI提示词&#xff1a; 角色 你是一位资深的前端工程师、设计师和插画师 设计风格 优雅的极简主义美学与功能的完美平衡; 清新柔和的渐变配色与品牌色系浑然一体; 恰到好处的留白设计; 轻盈通透的沉浸式体验; 信息层级通过微妙的阴影过渡与模块化卡片布局清晰呈现; 按钮添加…

跟着AI学习C# Day12

&#x1f4c5; Day 12&#xff1a;LINQ&#xff08;Language Integrated Query&#xff09;基础 ✅ 目标&#xff1a; 理解 LINQ 的基本概念和作用&#xff1b;掌握使用 LINQ 查询集合&#xff08;如 List<T>、Array&#xff09;&#xff1b;学会使用常用 LINQ 方法&am…

ubuntu网络管理五花八门netplan 、NetworkManager、systemd、networking是什么关系

文章目录 **1. Netplan&#xff08;网络配置抽象层&#xff09;****2. NetworkManager&#xff08;动态网络管理&#xff09;****3. systemd-networkd&#xff08;轻量级网络管理&#xff09;****4. networking&#xff08;传统的 ifupdown&#xff09;****5. 它们之间的关系**…

Python爬虫实战:研究Twisted框架相关技术

1. 引言 1.1 研究背景与意义 随着互联网信息的爆炸式增长,网络爬虫作为一种高效获取和收集网络信息的技术手段,在搜索引擎优化、市场调研、数据挖掘等领域有着广泛的应用。传统的同步爬虫在面对大量 URL 请求时,由于 I/O 操作的阻塞特性,效率低下,难以满足实际应用需求。…

内网运行控制四百来个海康威视硬件物联网定员管控软件(华为平板电脑版)

内网运行控制四百来个海康威视硬件物联网定员管控软件&#xff08;华为平板电脑版&#xff09; 从去年12月至今&#xff0c;自研一套在内网中的华为平板电脑上运行&#xff0c;控制四百来个海康威视硬件的物联网定员管控软件&#xff0c;开始上线投入运行。 运行环境为华为平板…

C++ 面向对象特性详解:继承机制

&#x1f680; C 面向对象特性详解&#xff1a;继承机制全解析——代码复用与扩展的核心&#xff08;含实战陷阱&#xff09; &#x1f4c5; 更新时间&#xff1a;2025年6月19日 &#x1f3f7;️ 标签&#xff1a;C | 继承 | OOP | 面向对象 | 代码复用 | C基础 文章目录 &…

学习日记-day33-6.19

知识点&#xff1a; 1.Spring课程概述 知识点 核心内容 重点 Spring框架概述 轻量级容器框架&#xff0c;封装复杂逻辑&#xff0c;需理解IOC、AOP等核心机制 容器框架 vs 普通框架、封装带来的理解门槛 学习难点 动态代理、反射、注解、IO操作、XML解析、容器&#xf…

网络编程中操作系统连接队列管理:Linux TCP队列深度解析

在现代网络编程中&#xff0c;操作系统内核扮演着至关重要的角色&#xff0c;负责管理网络通信的复杂细节&#xff0c;从而为应用程序提供抽象接口。对于服务器应用程序而言&#xff0c;高效处理大量传入连接请求是确保性能和可靠性的核心。操作系统通过维护专门的队列机制来管…

StableDiffusion实战-手机壁纸制作 第一篇:从零基础到生成艺术品的第一步!

大家好!欢迎来到《StableDiffusion实战-手机壁纸制作》系列的第一篇! 在这一篇文章里,我们将一起探索如何用StableDiffusion(SD)这款强大的工具,快速制作出炫酷的手机壁纸。 如果你对生成艺术、AI绘图感兴趣,那你一定不能错过! 你能做什么?你将做什么! 在之前的系…

运维——14.PowerShell 与Linux 、 macOS通用的命令

PowerShell 最初是 Windows 平台的&#xff0c;但现在已经有了 PowerShell Core&#xff0c;它是跨平台的&#xff0c;支持 Linux 和 macOS。在 PowerShell Core 中有一些Linux 和 macOS通用的命令。理清楚这些有助于学习多系统命令。 在 Linux/macOS 上使用 PowerShell 完成文…

C#的泛型和匿名类型

一、C#的泛型简介 泛型是一种允许你延迟编写类或方法中的数据类型规范&#xff0c;直到你在实际使用时才替换为具体的数据类型【简单的说&#xff1a;泛型就是允许我们编写能够适用于任何数据类型的代码&#xff0c;而无需为每种特定类型重写相同的代码】(T是类型参数&#xff…

日语面试ai助手推荐:高效备考并应对日语面试难题

在准备日语面试的路上&#xff0c;你是否时常感到力不从心&#xff1f;每到模拟面试环节&#xff0c;总怕自己答非所问、用语不地道&#xff0c;或是紧张到脑子一片空白。查找资料时&#xff0c;面对海量的日语问答、面试范本和专业术语&#xff0c;常常分不清轻重缓急&#xf…

【63 Pandas+Pyecharts | 泡泡玛特微博热搜评论数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 数据信息2.3 数据去重2.4 数据去空2.5 时间处理2.6 性别处理2.7 评论内容处理 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 用户评论IP分…

python-最长无重复子数组

最长无重复子数组 描述代码实现 描述 给定一个长度为n的数组arr&#xff0c;返回arr的最长无重复元素子数组的长度&#xff0c;无重复指的是所有数字都不相同。 子数组是连续的&#xff0c;比如[1,3,5,7,9]的子数组有[1,3]&#xff0c;[3,5,7]等等&#xff0c;但是[1,3,7]不是…

探索 MySQL 缓存机制:提升数据库读取性能的有效策略

在现代应用中,数据库的读取性能是影响用户体验和系统响应速度的关键因素。当应用程序面临高并发读请求时,直接访问磁盘的开销会成为瓶颈。为了应对这一挑战,MySQL 引入了多种缓存机制,旨在减少磁盘 I/O,加快数据检索速度。 理解并合理利用这些缓存机制,是提升 MySQL 数据…

深度学习-164-MCP技术之开发本地MCP服务器和异步客户端

文章目录 1 概念1.1 MCP1.2 准备数据接口2 开发MCP服务器2.1 server.py2.1.1 @mcp.resource2.1.2 @mcp.tool()2.1.3 @mcp.prompt()2.2 调试模式启动mcp-server2.2.1 资源2.2.2 工具2.2.3 提示词3 开发MCP客户端3.1 调用工具client_tool3.2 获取提示client_prompt3.3 读取资源cl…