"DBA 是个der" 吵出MySQL主键问题多种解决方案

文摘   2024-10-21 06:00   法国  

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2500人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8)(1 2 3 4 5 群均已爆满,6群停止进人,新人进7 群 8 群)

上周五,因为MySQL的一个问题闹了点小争端,不过后面大家都理智,算是云淡风轻了。基于那个问题后面还有人说了自己公司的一个事情,算是引起我写这篇帖子的想法。

先说问题,各种异构的库,迁移到MySQL后的主键问题,我们先看一下原题。

上图中的问题,再次描述一下,在之前的SQL语句中,针对Oracle有 insert into table select sequence form 表,这里ORACLE ,PG 都有序列的概念,也就是我们产生一个序列,在插入的时候,我们调用序列来在插入数据的时候,自动进行自增或序列设置的数字递增的方式来进行数据的给出,且插入到表中。

但MySQL没有这个序列的概念,MySQL走的是在数据库底层设置整体的步长,且通过一列来进行数据的自增,那么这个怎么办。

简易方案:写函数,模拟一个自增的函数,在MySQL写一个函数,来进行自增,在语句中调用如

INSERT INTO your_table (id, column1, column2)
SELECT get_next_id(), column1, column2 FROM your_oracle_table;

CREATE FUNCTION get_next_id() RETURNS INT
BEGIN
   DECLARE new_id INT;
   SELECT COALESCE(MAX(id), 0) + 1 INTO new_id FROM your_table;
   RETURN new_id;
END;

这个部分在我看来是我目前用技术的方式,进行拼凑的一个方案,仅此而已,或者我们直接把这列空着,后面在补这个自增的数据也可,但具体是否可行 ,还的这个问的同学和他的技术人员自行决定。

而当时为什么“激情”给出了其他的方案,且造成群里早上的“动乱”,甚至引起其他的数据库大佬私信,问怎么回事。

其实我是想说说的,MySQL作为迁移目的地的问题,以及一些白痴领导,白痴的架构师,犯下的罪行。

1 ORACLE TO MySQL 是否合适,这是我想讨论的第一个问题

Oracle的数据组织是HEAP 表,也就是说Oracle的表本身可以没有主键,同时在一些工作的年头中,没有主键的表的确在早期一些公司存在,且常见。

Oracle的数据量承载的量级,尤其是单表,分区表等,可以承载的量是非常大的,MySQL基于他自己的数据承载物理结构,B+tree 表是非常不太适合进行单表承载几亿甚至更多的数据的。

Oracle支持复杂的查询语句的撰写和优秀的优化器,进行处理这些语句的执行,MySQL在这方面对比Oracle 差距较大。

写到这里就这三个问题,已经是系统运行中的,迁移Oracle TO MySQL后需要遇到的一些棘手,且难以解决的问题了,我就想问一句,主管数据库迁移的领导,或者主管这部分的架构师,你们从哪里得出结论,说ORACLE 迁移到MySQL是一个常用的方案,且成为前几年的一些主流方案。

为什么,你们解释一下???? 你们解释不了,我给你你们说说你们可能且真实的想法

1  要名,不付出的人,这多见于一些领导,对于技术从来不关心,不知道那天从哪个其他的企业听闻,Oracle的政治问题,政策问题,反正影响他,官职和荣誉的问题,他要符合“潮流”,且把Oracle 替换掉,也不知道从哪里听了一耳朵,MySQL这个名字,且有些企业做过替换的事情,他就不管不顾,不闻不问,给下边人压力,换,把ORACLE 换了,用MySQL, 这样的事情估计不少,且很多人认为很正常。

2  架构师的无知,这样的架构师我见过,还不少,多见于某些,算了不说了要不打击面太大,这样的架构师生平,就懂俩数据库,ORACLE AND MySQL,这里并未说Oracle 不能迁移到MySQL,而是看基础,看可行性,需要评估后期的影响和改造的方式,比如有些公司或企业,他们进行了整体的改造,比如分库分表,逻辑分库,物理分库,使用中间件来进行,等等,虽然改造成本过大,但那是一个完整的方案,有些架构师无知到,就知道直接更换的程度,可能最近几年少了,之前这样的不少。

麻烦,架构师,架构师,你的见多识广,上到业务,下到基础组件的见识,如果你见识短,头发长,你还是干程序员比较合适,我见过太多的 DBA 被这样的架构师坑哭 ,对没错坑哭过,生不如死,且还的做背锅侠。咱们得具有反抗意识,不是说不让他办这个蠢事情,而是你的让他知道最后的代价,且让他也顺不了心,这里牵扯到人生哲理,不多言了,弱者之所以弱,还是自己不强,厉害的DBA ,架构师他敢。


这里也附带一下,Oracle到MySQL的主键一些处理和设计上的技术方案,也不枉我,骂粗制滥造的架构师一顿。

ORACLE TO MySQL主键方案1:

这里必须得讨论业务,不讨论业务进行数据库迁移,那就有点精神病院出来的“科学家”,先看业务,看表,是否可以存在一个列,自增列,且这个自增列与业务无关,完全是为了MySQL的物理特性而建立的主键,查询基本上用不到。(查询语句也不要是select * from table ,否则这个方案失效)

ORACLE TO MySQL主键方案2:

联合主键,我相信即使你用ORACLE ,也不可能让ORACLE的表裸奔,没有任何去重的字段,哪怕是联合的,那么能去重的字段,或者联合的字段就是你的MySQL的主键,虽然效率不高,但最起码你有主键了。(注意字段的数量和字段的类型)

ORACLE TO MySQL主键方案 2 升级版

联合主键变为一个字段,通过算法,举例如MD5或者sha256等,或者自己写雪花算法也可,将这些字段的值进行合并计算,成为一个新的字段,这个字段就是新的主键,这个就需要进行程序的略微改造了,比如你的有把几个字段进行合并运算的部分,且将这个值插入到主键中,而这个主键就可以和业务关联了。(好处是自然,多逻辑字段但实际上就一个字段做物理主键)

ORACLE TO MySQL主键方案 3

雪花有序算法,这个多见于物理分库的情况下,常常使用,主键就赋予更重要的意义,包含了寻址数据的意义,所以算法必须是产生唯一值,且不撞KEY的,至于什么算法,架构师们,你们的活。

ORACLE TO MySQL 主键方案 3 变种

写函数,对在MySQL中写函数,通过函数来产生值,也就是你给函数一个值,函数给你算出一个主键,今天上面的方案就是这个方案,通过获取当前表的最后一个值,我们在插入的时候,将值+1 ,然后插入来模拟ORACLE 的序列。

ORACLE TO MySQL 主键方案 4 ......  就写到这吧,回来让架构师都学了去,在“欺负” DBA。

其实5群里,一个同学的在:“激烈的” 沟通中,说了一句话,我简单描述一下,“架构师认识你 DBA 是个der”

这里我知道这个想法的人,应该有一定数量集,我想回复的是,任何时候,自己不强,谁都可以欺负你,国家如此,城市如此,人也如此。

架构师不是高高在上,DBA 也不是贫贱如屎,市面上的数据库抄起来,你都会点,懂点,有方案,你比架构师在数据库方面知道的还多,他不会欺负你,他过来请教你还来不及呢!

但凡DBA 会点 PostgreSQL , Oceanbase, 达梦, 咱们也不会随便被迁移ORACLE 的问题词穷!  人穷志短,知识少,也一样的短!!人类社会再高级,再文明,始终是拳头说话,实力说话,能力说话。





置顶文章

PostgreSQL 远程管理越来越简单,6个自动化脚本开胃菜

OceanBase  学习记录 --  开始入门

参加 “央企” 项目改造会后的,“数据库瞎想”

PostgreSQL DBA硬扛 垃圾 “开发”,“架构师”,滥用PG 你们滚出 !(附送定期清理连接脚本)

PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless

MySQL还用学吗?这谁问的 “好问题” !

MySQL 8.0x 到 9.0均可能崩溃--云厂商开发指责 MYSQL不测试就推新版本?

MySQL 让你还用5.7 出事了吧,用着用着5.7崩了

MySQL 8.0 小版本更新要点,那个小版本更稳定(8.0.24-8.0.37)

MySQL 8.0 版本更新 要点 列表 (8.0-8.0.23)

DBA 失职导致 PostgreSQL 日志疯涨

微软 “爱” 上PostgreSQL, PG  “嫁给” 微软!

撕逼!PostgreSQL 和 MongoDB 开撕,MySQL却躺枪

阿里云 安全扫描 ,说我PostgreSQL 自建主机极度不安全, 谁的问题?

PostgreSQL 13.0-13.15 功能更新和bug fixed列表

撕逼!PostgreSQL 和 MongoDB 开撕,MySQL却躺枪





往期热门文章:

MongoDB 插入更新数据慢,开发问哪的问题?附带解决方案和脚本

用MySql不是MySQL, 不用MySQL都是MySQL 横批 哼哼哈哈啊啊

PostgreSQL  哪些版本尽量避免使用,版本更新重点明晰(PG12)

PostgreSQL  15 16 小版本更新信息小结 版本更新是不是挤牙膏

PostgreSQL 14 小版本分析,有那个版本不建议使用

Windows 是MySQL和PostgreSQL高性能数据库的坟墓

PostgreSQL 具有createdb的用户无法创建数据库的原因(之一)

道歉贴,为最近写的一篇“垃圾贴”

PostgreSQL 同样的语句 一会快 一会慢到底怎么回事,
MongoDB  系统IOPS 告警系统处于崩溃,优化语句从1秒优化到1毫秒解决问题
云原生数据库是青出于蓝胜于蓝,还是数据库产品的倒退?
专访唐建法-从MongoDB中国第一人到TapData掌门人的故事
MySQL 8.0x 到 9.0均可能崩溃--云厂商开发指责 MYSQL不测试就推新版本?
DISS 阿里云 DAS数据库服务,阿里云数据库服务的毒瘤

临时工说:DBA 7*24H 给2万的工作,到底去不去?

PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈

PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆

MySQL 让你还用5.7 出事了吧,用着用着5.7崩了

临时工访谈:问金融软件开发总监  哪些业务不用传统数据库
PolarDB  Serverless POC测试中有没有坑与发现的疑问
临时工访谈:PolarDB Serverless  发现“大”问题了  之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
PolarDB for PostgreSQL  有意思吗?有意思呀
PolarDB  Serverless POC测试中有没有坑与发现的疑问

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:从国产数据库 到 普罗大众的产品 !与在美国创业软件公司老板对话

PostgreSQL 如何通过工具来分析PG 内存泄露

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验
临时工访谈:我很普通,但我也有生存的权利,大龄程序员 求职贴
临时工说: 快速识别 “海洋贝壳类” 数据库方法速递
临时工说:国产 数据库 销售人员  图鉴
临时工说:DBA 是不是阻碍国产数据库发展的毒瘤 ,是不是?从国产
PostgreSQL   玩PG我们是认真的,vacuum 稳定性平台我们有了
临时工说:裁员裁到 DBA 咋办  临时工教你 套路1 2 3
PolarDB  搞那么多复杂磁盘计费的东西,抽筋了吗?
临时工说:OceanBase 到访,果然数据库的世界很卷,没边
MONGODB  ---- Austindatabases  历年文章合集
MYSQL  --Austindatabases 历年文章合集
POSTGRESQL --Austindatabaes 历年文章整理
POLARDB  -- Ausitndatabases 历年的文章集合
PostgreSQL  查询语句开发写不好是必然,不是PG的锅
SQL SERVER 如何实现UNDO REDO  和PostgreSQL 有近亲关系吗
MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
MongoDB  双机热备那篇文章是  “毒”
MongoDB   会丢数据吗?在次补刀MongoDB  双机热备
临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处
POLARDB  到底打倒了谁  PPT 分享 (文字版)
PostgreSQL  字符集乌龙导致数据查询排序的问题,与 MySQL 稳定 "PG不稳定"
PostgreSQL  Patroni 3.0 新功能规划 2023年 纽约PG 大会 (音译)

Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlServer,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。
截止今天共发布 1235篇文章


AustinDatabases
关于数据库相关的知识分享
 最新文章