自打有了GIPKs,DBA和開發再也不用battle了

来源:https://www.cnblogs.com/greatsql/archive/2023/07/17/17559201.html
-Advertisement-
Play Games

- 1. GIPKs特性簡介 - 2. GIPKs特性的作用 - 3. 玩轉GIPKs > GIPKs解決了歷史難題 ## 1. GIPKs特性簡介 從MySQL 8.0.30開始,新引入一個叫做GPIKs的特性,其全稱是 **Generated Invisible Primary Keys**,簡 ...


    1. GIPKs特性簡介
    1. GIPKs特性的作用
    1. 玩轉GIPKs

GIPKs解決了歷史難題

1. GIPKs特性簡介

從MySQL 8.0.30開始,新引入一個叫做GPIKs的特性,其全稱是 Generated Invisible Primary Keys,簡言之就是 自動生成隱含的主鍵列,更完整的說法是:啟用GIPKs後,當新建的InnoDB表沒有顯式主鍵時,會自動創建一個不可見的主鍵列 my_row_id,這個列會被定義為 bigint unsigned NOT NULL AUTO_INCREMENT,並且是不可見的(INVISIBLE)。

2. GIPKs特性的作用

實際上這個特性在有些分支版本上早就已經實現了,這個需求也是非常迫切,MySQL官方對這個特性的支持雖遲但到,積極意義還是很大滴,解決了幾個歷史難題:

  1. DBA無需再和開發battle,強調一定要有顯式自增主鍵列。當然了,個別情況下非要顯式指定非自增列(例如選擇UUID/VARCHAR類型列)做主鍵的,DBA也無可奈何啊。
  2. 在MGR架構中,也不用要求每個InnoDB表都必須要有顯式定義的主鍵列。

上述這兩種情況下,都可以從GIPKs特性中獲益,會自動創建隱含的 my_row_id 主鍵列。

GIPKs特性帶來的一點點不便是,當我們想要顯式創建一個名為 my_row_id 的列名時,會報錯,不讓創建,因為被GIPKs特性給當做保留關鍵字了,例如:

greatsql> create table t2(
id bigint unsigned not null auto_increment,
my_row_id int NOT NULL);
ERROR 4109 (HY000): Failed to generate invisible primary key. Auto-increment column already exists.

需要註意的是,在傳統主從複製或MGR架構中,GIPKs特性的設置值不會被覆制到從節點,僅影響當前節點。不過,這完全不影響主從複製或MGR的正常工作,也就是說:在主節點上創建無顯式定義主鍵列的表數據,可以正常複製到從節點。前提條件是設置 binlog_format = row,在MGR中,要求binlog必須採用row格式。

另外,mysqldump 中也相應增加了新選項 --skip-generated-invisible-primary-key,用於指定備份時是否要忽略隱含主鍵列。

3. 玩轉GIPKs

下麵我們在MGR環境中舉慄說明怎麼玩轉GIPKs特性:

# 當前使用 GreatSQL 8.0.32-24 版本
greatsql> \s
..
Server version:  8.0.32-24 GreatSQL, Release 24, Revision 3714067bc8c
...

# 在MGR環境中測試
greatsql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 2adec6d2-febb-11ed-baca-d08e7908bcb1 | 192.168.5.160 |        3307 | ONLINE       | SECONDARY   | 8.0.32         | XCom                       |
| group_replication_applier | 2f68fee2-febb-11ed-b51e-d08e7908bcb1 | 192.168.5.160 |        3308 | ONLINE       | ARBITRATOR  | 8.0.32         | XCom                       |
| group_replication_applier | 5e34a5e2-feb6-11ed-b288-d08e7908bcb1 | 192.168.5.160 |        3306 | ONLINE       | PRIMARY     | 8.0.32         | XCom                       |
+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+

# 確認啟用GIPKs特性
greatsql> show variables like 'sql_generate_invisible_primary_key';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| sql_generate_invisible_primary_key | ON    |
+------------------------------------+-------+

# 新建表,未顯式指定主鍵列
greatsql> create table t1 ( id int not null, c1 varchar(10) not null, unique key(id));

greatsql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  `id` int NOT NULL,
  `c1` varchar(10) NOT NULL,
  PRIMARY KEY (`my_row_id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

可以看到,在建表時已經創建了唯一索引列(該索引列可以被選用作聚集索引),但由於沒顯式指定主鍵索引,所以還是會創建一個隱含的主鍵列 my_row_id,這個隱含的主鍵列預設是不可見的,除非我們手動修改其可見性。

# 即便是 SELECT *,也無法讀取隱含的主鍵列
greatsql> select * from t1;
+----+----+
| id | c1 |
+----+----+
|  1 | c1 |
|  2 | c2 |
+----+----+

# 除非修改隱含主鍵列為可見
greatsql> alter table t1 alter column my_row_id set visible;

# 這時就能看到這個隱含主鍵列
greatsql> select * from t1;
+-----------+----+----+
| my_row_id | id | c1 |
+-----------+----+----+
|         1 |  1 | c1 |
|         2 |  2 | c2 |
+-----------+----+----+

# 再次查看表結構
greatsql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `id` int NOT NULL,
  `c1` varchar(10) NOT NULL,
  PRIMARY KEY (`my_row_id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

# 還可以再次將其設置為不可見
greatsql> alter table t1 alter column my_row_id set invisible;

greatsql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  `id` int NOT NULL,
  `c1` varchar(10) NOT NULL,
  PRIMARY KEY (`my_row_id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

如果不想繼續使用該隱含列作為主鍵,可以執行類似下麵的SQL命令進行修改:

# 刪除隱含主鍵列、主鍵,並新建自定義的主鍵列
greatsql> alter table t1 drop column my_row_id, drop primary key, add aid bigint unsigned not null auto_increment primary key first;

# 再次查看表結構和查詢表數據
greatsql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `aid` bigint unsigned NOT NULL AUTO_INCREMENT,
  `id` int NOT NULL,
  `c1` varchar(10) NOT NULL,
  PRIMARY KEY (`aid`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

greatsql> select * from t1;
+-----+----+----+
| aid | id | c1 |
+-----+----+----+
|   1 |  1 | c1 |
|   2 |  2 | c2 |
+-----+----+----+

可以看到,GIPKs特性還是很靈活實用的。

P.S,最新發佈的GreatSQL 8.0.32-24版本中,已經包含了該特性,可以放心使用。

全文完。

Enjoy GreatSQL

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章將和大家分享 ASP.NET Core SignalR 中的中心篩選器。 本文大部分內容摘自微軟官網:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hub-filters?view=aspnetcore-7.0 廢話不多說,下麵我們直 ...
  • 1.ReferenceEquals(object o1, object o2): 靜態方法:比較兩個對象的引用,引用相同返回true,否則返回false,同為null是返回true;ReferenceEquals進行值類型比較時總是返回false,因為兩個值類型需要分別裝箱到對象中,是不同的引用 ; ...
  • # shell腳本-Nginx訪問日誌分析 ## 1.原理 > 可以通過/usr/local/nginx/logs/access.log 文件-查看nginx的日誌 > > ``` > [root@localhost scripts]# tail -f /usr/local/nginx/logs/a ...
  • ## 跟運維學 Linux - 01 ### 運維的誕生 運維工程師有很多叫法:系統運維、Linux 工程師、系統管理員... `網管`可以說是運維工程師最早的雛形。在個人電腦未普及時,大家去網吧玩游戲。 玩家:“網關,我的電腦上不了網了” 網管負責維修電腦、維修系統、維護網路設備... ### 互 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230717125930891-211733509.png) # 1. 計算同一組或分區的行之間的差 ## 1.1. 最終結果集 ### 1.1.1. sql ```sql D ...
  • 一、DQL介紹 DQL全稱:Data Query Language(數據查詢語言),用來查詢資料庫中表的記錄。 關鍵字:select 二、DQL語法 select 欄位列表 from 表名列表 where 條件列表 group by 分組欄位列表 having 分組後條件列表 order by 排序 ...
  • Oracle資料庫 在Oracle資料庫中,''(空字元串)與null是什麼關係呢? ''(空字元串)是否會等同(或者說等價於)於null值呢?''跟' '(長度為零的空字元串或包含一個或多個空格的空字元串)是否又等價?下麵我們測試一下 SQL> create table test(id numbe ...
  • 魔笛活動平臺要記錄每個活動的用戶行為數據,幫助客服、運營、產品、研發等快速處理客訴、解決線上問題併進行相關數據分析和報警。可以預見到需要存儲和分析海量數據,預估至少幾十億甚至上百億的數據量,所以需要選擇一款能存儲海量數據的資料庫。由於是通過接收MQ存儲或者API方式存儲,所以對實時寫入性能也有一定要... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...