MySQL 8 如何解决快速获取数据库中所有业务库表列的distinct 值,不使用SQL

news2024/12/22 19:31:21

5f2c9477adf1c95190b0eacf4e3c7412.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共790人左右 1 + 2)

最近我们接到一个需求,在数据库内,无准确目标的寻找每个表中的字里面包含某些 特殊字符的列。工作了快半辈子了,也是第一次听说这样的“奇葩”的需求。经过和需求提出者的沟通,原因是在软件设计之初因为使用到图片,所以将图片的地址都塞到了数据库的各个与之有关的表的字段里面,凡是调用图片的地方,所以开发到现在,也不知道哪个表,哪个列用了这个部分,同时因为要更换图片的存储的位置,所以要“大海捞针的” 去改 。Interesting !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

咋办,凉拌,DBA 需要帮助一下,传统的思维模式,通过系统表把所有表的varchar ,text  字段都弄出来,在自动化的进行select 字段 from  表 where  字段 like  %字符%  or like %字符 or like  字符% 的方式把匹配的列找到。你真的要这么干,N个物理的INSTANCE 都要这样!!!!

71631a5e91fe593ea0220003f7803bad.png

OMG ,这么多年这么奇葩的要求我也是第一次听说,咋地让小伙伴们去人肉数据库表列,这可不是我的作风。

那么怎么办,既然是8.025的MYSQL,那么不用直方图来解决这个问题,就真的太挫了,因为我从来不希望自己就是一个操作机器。在CHART GPT 的世界,甘心做机器,最终都会被替代。比如 用新奇的点子来给 CHART GPT 上一课。

这个直方图是在MYSQL 8.03 提出的,他可以解决每个表,每个列的值的分布和DISTINCT 的问题。直方图是对列数据分布的一种近似。它可以以相当准确的方式告诉您数据是否偏斜,这反过来又有助于数据库服务器了解其包含的数据性质。直方图有许多不同类型,在MySQL中我们选择支持两种不同的类型:“单例”直方图和“等高”直方图。所有直方图类型的共同点是它们将数据集划分为一组“桶”,MySQL会自动将值划分到各个桶中,并自动决定要创建哪种类型的直方图。

顺便吐槽一句,MYSQL在这个方面和PG 比,人家甩你可不是几条街的问题。

言归正传,怎么这个方式就可以解决这个问题,我们做一个实验

ANALYZE TABLE  actor update histogram on first_name,last_name with 100 buckets;6a71a28a07ca68663e74365b9466395b.png

需要注意的是,桶的个数必须指定,取值范围为1 ~ 1024。你应该为你的数据集选择多少个桶取决于几个因素;你有多少不同的值,你的数据集有多倾斜,你需要多高的精度等等。然而,在一定数量的桶之后,增加的精度相当低。所以我们建议从一个较低的数字开始,比如32,如果你发现它不符合你的需求,就增加它。

当指定要构建直方图时,服务器将把所有数据读入内存并在内存中完成所有工作(包括排序)。然后,如果您想要在一个非常大的表上生成直方图,您可能会冒着将数百兆字节的数据读入内存的风险,这可能不太合适。因此,为了解决这个问题,MySQL将计算在系统变量histogram_generation_max_mem_size指定的内存量下可以容纳多少行数据。如果它意识到只能在给定的内存限制内容纳部分行,它将采用抽样方法。这可以通过查看属性“sampling-rate”来观察。

e0a6953bb7a97b3938f4141ac151642b.png

运行对表列分析的产生直方图后,根据表中的标识的schema_name,table_name,column_name, Histogram 来对表的列进行一个标识,其中可以看下图中histogram中的buckedts 并不是你认识的文字,而是base64 type254 ,在MYSQL中这些字符是为了减少存储的,直接MYSQL可以将这些全部转换为,原来的字符,方式为


2d894f6e73ef0bec08e0b1336072cc40.png

 SELECT convert(FROM_BASE64('Q1JVWg==')using utf8) as words;

b73371de0ac2f33666bd8af5725c45a4.png

通过这样的方式就可以将字符转换成原来的字符。

SELECT convert(FROM_BASE64('Q1JVWg==')using utf8) as decoded_data;

在JAVA 中可以通过如下的方式来进行转换

在 Java 程序中,如果需要将 Base64 编码的数据 (Type 254) 转换成 UTF-8 字符串,请遵循以下步骤:

    导入所需库:
    java
import java.nio.charset.StandardCharsets;
import java.util.Base64;
使用 Base64.getDecoder().decode() 方法对 Base64 编码的字符串进行解码,返回一个字节数组:
java
String base64String = "Q2hhdEdQVA=="; // 示例 Base64 编码字符串
byte[] decodedBytes = Base64.getDecoder().decode(base64String);
将解码后的字节数组转换为 UTF-8 字符串:
java
    String utf8String = new String(decodedBytes, StandardCharsets.UTF_8);
现在,utf8String 变量包含了解码后的 UTF-8 字符串。完整示例如下:
java
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Base64ToUTF8 {
    public static void main(String[] args) {
        String base64String = "Q2hhdEdQVA=="; // 示例 Base64 编码字符串
        byte[] decodedBytes = Base64.getDecoder().decode(base64String);
        String utf8String = new String(decodedBytes, StandardCharsets.UTF_8);
        System.out.println("Decoded UTF-8 String: " + utf8String);

通过这样的方式DBA 快速的获取所有表中的字段的distinct值,然后让程序员读入histogram 字段,通过JAVA 程序快速解码和分析,找出本列是否有他们要的 值, 问题解决。

当然说到这里,肯定有人说,不对你这个是采样的,不准确,怎么办,呵呵,怎么办,我热炒,这里有一个值是 sampling_rate,只要在采样后,他的值是1 即可,那么我们我的采样率一定是百分之百的正确。(采样时)

至于怎么想出这个法子的,呵呵 回来再说。

e4461a15194973a1141d7f53cc4f64a8.png

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

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

相关文章

推荐 5 个本周 火火火 的开源项目

本周推荐开源项目目录: 1. 你的私人 GPT 2. 集成 AI 的数据库客户端工具 3. Switch 模拟器 4. 开源的短视频生成和编辑工具 5. 医疗领域的微调模型 01 你的私人 GPT privateGPT 开源两周,便斩获了 10K 的 Star。可以在离线的情况下,使用 GPT …

AMBER分子动力学模拟之分子模拟-- HIV蛋白酶-抑制剂复合物(2)

AMBER分子动力学模拟之分子模拟-- HIV蛋白酶-抑制剂复合物(2) 体系平衡 体系的优化分为两步,第一步固定蛋白和小分子,对添加的水盒优化。第二步则是对整个体系的优化。 对水盒子优化 vim min1.in &cntrl imin1, maxcyc10000, ncyc5000, ntb1, …

杂记——22.强弱类型语言的区别

这篇文章我们来讲一下强类型语言和弱类型语言,并分析一下二者的区别 目录 1.强类型语言 2.弱类型语言 3.区别 3.1编译型和解释型 3.2动态语言和静态语言 3.3 强类型定义语言和弱类型定义语言 4.静态类型语言的优势 1.强类型语言 强类型语言也称为强类型定义…

error C2143: 语法错误 : 缺少“)”(在“常量”的前面)

【背景】最近做一个项目,需要使用到凌华的运动控制卡和IO卡,在测试工程中,使用的类和引用的库文件都一切正常。 测试完成后,本着可重复移植的考虑,将整个文件夹添加到现有工程中,却出现了非常奇怪的编译错误…

JVM系列-第9章-StringTable(字符串常量池)

StringTable(字符串常量池) String的基本特性 String:字符串,使用一对 “” 引起来表示 String s1 "atguigu" ; // 字面量的定义方式String s2 new String("hello"); // new 对象的方式String被…

基于html+css的图展示73

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【fly-iot飞凡物联】():开源项目Apache IoTDB,开源项目学习,原来还有这样的项目,关于IOT的几个开源项目汇总下

目录 前言1,关于:开源项目Apache IoTDB2,还有个admin后台3,thinglinks项目4,thingsboard-ui-vue项目5,apache pulsar项目6,ActorCloud项目 前言 本文的原文连接是: https://blog.csdn.net/freew…

ASP.NET MVC-WebAPI请求

一、无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetUser() : 也可以用$.ajax({type:"get"}) 方式,正确的获得了返回数据: 二、…

Grafana功能菜单介绍(04)

Grafana的功能菜单设计为侧边栏(sidebar)形式,可以折叠隐藏,便于我们更加专注数据的可视化。现将菜单栏各项功能进行编号讲解,如下图所示。 ① Grafana的logo,即当前页为Grafana的Home page,在任何页面点击Grafana的logo,都会跳到Home Page。 ② 新建按钮,用于创建Da…

Camtasia Studio2023新功能及下载安装使用教程

Camtasia Studio2023新版本包含了屏幕录像、视频剪辑和编辑、视频录音配音、视频菜单制作、视频剧场和视频播放等功能。它可以在任何颜色模式下记录屏幕动作,包括影像、 音效、鼠标移动轨迹,解说声音等等;它支持视频播放和编辑压缩&#xff0…

Mars3d实现单击按钮高亮矢量对象

调用高亮的关键代码: let graphictruck new mars3d.graphic.ModelEntity({ position: [116.327881, 31.018378, 5000], style: { url: //data.mars3d.cn/gltf/mars/qiche.gltf, heading: 90, scale: 0.9, …

应用软件系统架构设计的“七种武器”

对于软件架构这一概念,有太多的版本,目前在业界由大师级人物或组织提出的对这一概念的阐述就超过十种以上,我个人比较赞同RUP(Rational Unified Process)中对软件架构的定义,即软件架构包含了关于以下问题的重要决策: …

剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 数据范围…

c++ 11标准模板(STL) std::set(四)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

让 ChatGPT 来担任这个召之即来挥之即去的私人健身教练

健身教练 和ChatGPT聊天可以运用在各种正式、非正式&#xff0c;工作、休闲场合&#xff0c;让我们再来看一个场景&#xff0c;也是年轻人群体中非常热门的话题&#xff1a;健身。健身已经是年轻人最流行的活动&#xff0c;既可以是私密的个人健身&#xff0c;也可以是呼朋唤友…

JAVA集合,复杂度,泛型

泛型: 1.存储数据的时候 可以帮我们进行自动的类型检查 2.获取元素的时候&#xff0c;可以帮我们进行类型转换 获取数据时&#xff0c;不需要强转类型转换。 类型形参一般使用一个大写字母表示&#xff0c;常用的名称有&#xff1a; E 表示 Element K 表示 Key V 表示 …

多目标跟踪:视觉联合检测和跟踪

国内头部以自动驾驶全站技术为主线的交流学习社区&#xff08;感知、归控等&#xff09;&#xff0c;包含大量前沿论文解读、工程实践(源代码)、视频课程&#xff0c;热招岗位。欢迎加入&#xff01; 点击上方“迈微AI研习社”&#xff0c;选择“星标★”公众号 重磅干货&#…

Python每日一练(20230516) 打家劫舍 I\II\III\IV HouseRobber

目录 1. 打家劫舍 I House Robber i 2. 打家劫舍 II House Robber ii 3. 打家劫舍 III House Robber iii 4. 打家劫舍 IV House Robber iv &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

除了OA以外,只用点击按钮就能实现协同办公,靠一个工具就能实现

OA不同时期&#xff0c;不同功能 OA是办公自动化系统&#xff0c;与互联网技术的发展有着密切的联系。 很多办公场景都离不开OA协同系统。OA是办公系统&#xff0c;借助与互联网的交互性&#xff0c;开创出的一种新型的办公方式。 所以&#xff0c;说到OA软件&#xff0c;在不…

Linux 网络基础(1)基础知识、IP地址、端口、协议、网络字节序

基础知识 网络发展背景&#xff1a; 网络的划分&#xff1a;局域网&#xff08;覆盖范围在1000m以内&#xff09;、城域网&#xff08;覆盖范围在20km以内&#xff09;、广域网&#xff08;更大范围&#xff09; 组网方式&#xff1a;以太网、令牌环网.... 日常名词&#xff1a…