色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

討論MySQL 8.0中的幾個(gè)隱藏的特性

OSC開源社區(qū) ? 來源:Percona 官網(wǎng)博客 ? 2023-08-10 10:07 ? 次閱讀

隱藏列

8.0.23 新增隱藏列特性。什么是隱藏列?它基本上是一個(gè)表的常規(guī)列,具有自己的名稱和數(shù)據(jù)類型。

它像任何其他常規(guī)列一樣處理和更新,唯一的區(qū)別是對應(yīng)用程序不可見。

換句話說,只有在 SELECT 語句中明確搜索它時(shí),才能訪問它;否則,它就像一個(gè)不存在的列。

這個(gè)定義看起來很奇怪,但如果提供一個(gè)這個(gè)特性的真實(shí)使用案例,一切都應(yīng)該更清晰。

假設(shè)您的應(yīng)用程序代碼中有SELECT *查詢。作為經(jīng)驗(yàn)豐富的數(shù)據(jù)庫開發(fā)人員,您應(yīng)該知道這種查詢不應(yīng)存在于任何生產(chǎn)代碼中。

典型的問題是,當(dāng)您需要更改表架構(gòu),添加或刪除列,或者更糟的是在其他列中間添加新列時(shí)。

抓取到你應(yīng)用程序變量中的字段位置可能會(huì)完全打破應(yīng)用程序或觸發(fā)意外的錯(cuò)誤行為。

這就是您需要避免在應(yīng)用程序中使用SELECT *的原因。

在這種情況下,如果您需要避免更改應(yīng)用程序代碼以匹配新表架構(gòu),可以將新列添加為隱藏列,它不會(huì)返回給客戶端,因?yàn)槟牟樵儧]有明確搜索它。

所以,您的應(yīng)用程序不會(huì)失敗或出現(xiàn)奇怪的行為。

而這,就是隱藏列的用武之地。

您需要在列定義中使用INVISIBLE關(guān)鍵字。

當(dāng)您需要將列設(shè)置為可見時(shí),需要使用VISIBLE關(guān)鍵字。

讓我們看一個(gè)例子。 我們創(chuàng)建一個(gè)表并插入一些行:

mysql> CREATE TABLE articles (
  id INT UNSIGNED AUTO_INCREMENT,
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  article TEXT,
  PRIMARY KEY(id)
);
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO articles(article) VALUES
  ("This is first article"),
  ("This is second article"),
  ("This is third article");
Query OK, 3 rows affected (0.01 sec)  
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles;
+----+---------------------------+------------------------------+
| id | ts         | article        |
+----+---------------------------+------------------------------+
| 1 | 2023-07-28 1303 | This is first article |
| 2 | 2023-07-28 1303 | This is second article |
| 3 | 2023-07-28 1303 | This is third article |
+----+---------------------------+------------------------------+
有時(shí),我們決定必須在ts列之后向表中添加一個(gè)新的字段title。

為了避免我們的應(yīng)用程序因SELECT *和新添加的中間列等情況失效,我們必須將title列創(chuàng)建為INVISIBLE。
mysql> ALTER TABLE articles ADD COLUMN title VARCHAR(200) INVISIBLE AFTER ts;
Query OK, 0 rows affected (0.06 sec)  
Records: 0  Duplicates: 0  Warnings: 0

為新列提供一些值:

mysql> UPDATE articles SET title='Title 1' WHERE id=1;
UPDATE articles SET title='Title 2' WHERE id=2; 
UPDATE articles SET title='Title 3' WHERE id=3;

現(xiàn)在看看表架構(gòu):

CREATE TABLE `articles` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `ts` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `title` varchar(200) DEFAULT NULL /*!80023 INVISIBLE */,
  `article` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
你可以看到,該列被正確地標(biāo)記了INVISIBLE關(guān)鍵字。 再試一次SELECT *:
mysql> SELECT * FROM articles;
+----+---------------------------+------------------------------+
| id | ts         | article        |
+----+---------------------------+------------------------------+
| 1 | 2023-07-28 1303 | This is first article |
| 2 | 2023-07-28 1303 | This is second article |
| 3 | 2023-07-28 1303 | This is third article |
+----+---------------------------+------------------------------+

你看,該列沒有返回。這允許schema改變后查詢不會(huì)失敗。

如果你想看title,你必須明確尋址該字段:

mysql> SELECT id, ts, title, article FROM articles;
+----+---------------------------+-----------+------------------------------+
| id | ts                  | title   | article                |
+----+---------------------------+-----------+------------------------------+
|  1 | 2023-07-28 1303 | Title 1 | This is first article  |
|  2 | 2023-07-28 13:15:03 | Title 2 | This is second article |
|  3 | 2023-07-28 1303 | Title 3 | This is third article  |
+----+---------------------------+-----------+------------------------------+

使用以下 DDL 將列設(shè)置為可見:

mysql> ALTER TABLE articles MODIFY COLUMN title varchar(200) VISIBLE;
記住,隱藏列像任何其他常規(guī)列一樣處理,所以您可以隨時(shí)讀取和更新它們。

關(guān)于隱形性的元數(shù)據(jù)在information_schema中可用,INVISIBLE/VISIBLE關(guān)鍵字在 binlog 中保留,以便正確復(fù)制所有更改。

生成的隱藏主鍵

這個(gè)特性在 MySQL 8.0.30 開始提供。生成的隱藏主鍵(GIPK)是一種特殊的隱藏列,僅適用于 InnoDB 表。

沒有主鍵的情況下創(chuàng)建 InnoDB 表,往往不是一個(gè)好的選擇。

我們強(qiáng)烈建議您的表中始終創(chuàng)建顯式主鍵。您可能還知道,如果您不提供主鍵,InnoDB 會(huì)創(chuàng)建一個(gè)隱藏的主鍵,但是 GIPK 提供的新特性使主鍵可以變得可用和最后可見。

相反,隱含創(chuàng)建的早期隱藏主鍵既不能成為可用的也不能成為可見的。

該功能對于強(qiáng)制缺乏經(jīng)驗(yàn)的用戶的 InnoDB 表都具有顯式主鍵很有用,即使是隱藏的。

讓我們看看它是如何工作的。

默認(rèn)情況下,此功能被禁用,因此 MySQL 將繼續(xù)像過去一樣運(yùn)行。

要啟用 GIPK,您必須設(shè)置以下動(dòng)態(tài)系統(tǒng)變量(它具有全局和會(huì)話作用域):

mysql> SET [PERSIST] sql_generate_invisible_primary_key=ON; 

現(xiàn)在在不指定顯式主鍵的情況下創(chuàng)建一個(gè)表:

mysql> CREATE TABLE customer(name VARCHAR(50));
Query OK, 0 rows affected (0.03 sec)

檢查模式:

mysql> SHOW CREATE TABLE customerG
*************************** 1. row ***************************
  Table: customer  
Create Table: CREATE TABLE `customer` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
名為my_row_id的隱藏主鍵已經(jīng)自動(dòng)創(chuàng)建。

注意:

GIPK 的名稱始終為my_row_id。您不能在表中有相同名稱的列。

GIPK 的數(shù)據(jù)類型始終為使用 AUTO_INCREMENT 的 BIGINT UNSIGNED。

有趣的是,您可以在查詢中使用主鍵并在明確尋址時(shí)看到它,就像描述的隱藏列一樣。

mysql> INSERT INTO customer VALUES('Tim'),('Rob'),('Bob');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT my_row_id, name FROM customer;
+--------------+-------+
| my_row_id | name |
+--------------+-------+
|         1 |  Tim |
|         2 |  Rob |
|         3 |  Bob |
+--------------+-------+
3 rows in set (0.00 sec)

mysql> SELECT my_row_id, name FROM customer WHERE my_row_id=2;
+--------------+-------+
| my_row_id | name |
+--------------+-------+
|         2 |  Rob |
+--------------+-------+
1 row in set (0.00 sec)
很顯然。如果您執(zhí)行SELECT *,主鍵不會(huì)被返回:
mysql> SELECT * FROM customer WHERE my_row_id=2;
+-------+
| name |
+-------+
| Rob  |
+-------+

在某些時(shí)候,您最終可以決定使其可見,并在需要時(shí)更改名稱:

mysql> ALTER TABLE customer MODIFY `my_row_id` bigint unsigned not null auto_increment VISIBLE;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE customerG  
*************************** 1. row ***************************
  Table: customer
Create Table: CREATE TABLE `customer` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

隱藏索引

為了完成隱形事物的概述,我們也來討論一下隱藏索引。這是最古老的隱形特性,在 MySQL 8.0 的第一個(gè)版本中就引入了。

您可以使索引對優(yōu)化器不可見,以便測試如果該索引不存在,查詢的性能會(huì)如何。

不過,當(dāng)索引不可見時(shí),在針對表執(zhí)行任何 DML 語句(INSERT、UPDATE、DELETE、REPLACE)時(shí),它仍會(huì)得到更新。

您可以使用以下語句將索引設(shè)置為不可見和再次可見:

ALTER TABLE mytable ALTER INDEX my_idx INVISIBLE;
ALTER TABLE mytable ALTER INDEX my_idx VISIBLE;
隱藏索引可以測試在不考慮它的情況下查詢的執(zhí)行計(jì)劃。最大的優(yōu)點(diǎn)是您不需要?jiǎng)h除索引。請記住,索引刪除幾乎是瞬間完成的,但重建索引則不然。

根據(jù)表的大小,重建索引可能需要大量時(shí)間并過載服務(wù)器。另一種選擇是,您也可以使用IGNORE INDEX()索引提示,但在這種情況下,您可能會(huì)被迫在應(yīng)用程序代碼中的許多查詢上添加索引提示。

將索引設(shè)置為不可見將允許您在很短的時(shí)間內(nèi)開始測試查詢。并且您可以隨時(shí)輕松地將其設(shè)置回可見,而不會(huì)丟失任何更新。

注意:

主鍵(PRIMARY Key)不能隱藏

UNIQUE 索引可以隱藏,但仍會(huì)執(zhí)行唯一性檢查

有關(guān)索引不可見性的信息在information_schema中可用

索引不可見性會(huì)被正確復(fù)制

總結(jié)

從我的角度來看,你不應(yīng)該使用隱藏列,因?yàn)樽罴褜?shí)踐是不應(yīng)在任何應(yīng)用中部署SELECT *查詢。不過,在某些緊急情況下,此功能可能非常有用,可以飛快地解決問題。

但是之后要記住修復(fù)你的代碼并將隱藏列設(shè)置為可見會(huì)更好。 對 GIPK 來說,情況也差不多。只要記住為表提供顯式主鍵,就不需要此功能。

不過,它可以幫助一個(gè)創(chuàng)建時(shí)沒有主鍵的表擁有一個(gè)適當(dāng)?shù)闹麈I,這個(gè)主鍵可以方便地被使用和變得可見。

關(guān)于隱藏索引,這是一個(gè)非常簡單的功能,在測試時(shí)非常有用,特別是在可能使用多個(gè)索引,和不確定優(yōu)化器是否選擇了最佳執(zhí)行計(jì)劃的情況中。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    829

    瀏覽量

    26670
  • DDL
    DDL
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    6342
  • 電源優(yōu)化器
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    5414
  • MYSQL數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    0

    文章

    96

    瀏覽量

    9421

原文標(biāo)題:那些MySQL 8.0中的隱藏特性

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何在Rust連接和使用MySQL數(shù)據(jù)庫

    MySQL是一個(gè)廣泛使用的關(guān)系型數(shù)據(jù)庫,Rust作為一門相對較新的系統(tǒng)級編程語言,具有C語言般的高性能、安全、并發(fā)等特性,因此與MySQL一起使用是一種非常有趣的選擇。在本教程,我們
    的頭像 發(fā)表于 09-30 17:05 ?1736次閱讀

    新型電力穩(wěn)壓器幾個(gè)問題的討論

    新型電力穩(wěn)壓器幾個(gè)問題的討論 摘要:在新型無觸點(diǎn)補(bǔ)償式電力穩(wěn)壓器,采用雙向晶閘管作為開關(guān)器件。本文介紹
    發(fā)表于 07-10 11:07 ?632次閱讀
    新型電力穩(wěn)壓器<b class='flag-5'>中</b><b class='flag-5'>幾個(gè)</b>問題的<b class='flag-5'>討論</b>

    應(yīng)用傅氏算法的幾個(gè)問題討論

    應(yīng)用傅氏算法的幾個(gè)問題討論 傅氏算法在數(shù)字保護(hù)得到了廣泛的應(yīng)用,但關(guān)于傅氏算法余弦正弦系數(shù)a,b是否是信號相量的實(shí)部和虛部,作者一
    發(fā)表于 07-20 12:11 ?2006次閱讀
    應(yīng)用傅氏算法的<b class='flag-5'>幾個(gè)</b>問題<b class='flag-5'>討論</b>

    關(guān)于ThinkPad隱藏分區(qū)幾個(gè)必知細(xì)節(jié)

    關(guān)于ThinkPad隱藏分區(qū)幾個(gè)必知細(xì)節(jié) 1. 什么是隱藏分區(qū)   IBM沒有提供隨機(jī)的恢復(fù)光盤或者操作系統(tǒng)安裝光盤,操作系統(tǒng)、隨機(jī)軟件、設(shè)
    發(fā)表于 01-22 12:07 ?1282次閱讀

    MySQL5新特性之存儲過程

    MySQL5新特性之存儲過程 MySQL5新特性之存儲過程 MySQL5新特性之存儲過程
    發(fā)表于 06-12 10:08 ?0次下載

    騰訊云打造MySQL 8.0全新引擎,進(jìn)一步加速客戶產(chǎn)業(yè)升級

    據(jù)介紹,騰訊云數(shù)據(jù)庫 MySQL 8.0的內(nèi)核可以百分百完全兼容主流MySQL分支。相比官方版本,無論是單機(jī)模式、異步模式還是同步模式下, MySQL
    的頭像 發(fā)表于 07-09 14:54 ?2387次閱讀

    MySQL 5.7與MySQL 8.0 性能對比

    背景 測試mysql5.7和mysql8.0分別在讀寫,選定,只寫模式下不同并發(fā)時(shí)的性能(tps,qps) 最早 測試使用版本為mysql5.7.22和mysql8.0.15 sysb
    的頭像 發(fā)表于 11-03 09:26 ?1.7w次閱讀
    <b class='flag-5'>MySQL</b> 5.7與<b class='flag-5'>MySQL</b> <b class='flag-5'>8.0</b> 性能對比

    MySql環(huán)境一鍵安裝應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是MySql環(huán)境一鍵安裝應(yīng)用程序免費(fèi)下載。創(chuàng)建Mysql所需環(huán)境支持8.0以上版本,暫無測試過8.0以下版本
    發(fā)表于 02-26 15:01 ?7次下載

    MySQL超級復(fù)雜?分享幾個(gè)使用技巧

    MySQL是最知名的關(guān)系數(shù)據(jù)庫管理系統(tǒng),作為LAMP Web開發(fā)平臺,此開源解決方案在全球廣受歡迎。然而,它的流行并不意味著每個(gè)使用者都能從MySQL獲得最大收益,因?yàn)槿狈κ褂梅椒ǎ赡茏兂梢粋€(gè)
    發(fā)表于 01-19 16:53 ?675次閱讀

    分享幾個(gè)mysql優(yōu)化的工具

    對于正在運(yùn)行的mysql 性能如何?參數(shù)設(shè)置的是否合理?賬號設(shè)置的是否存在安全隱患?
    的頭像 發(fā)表于 09-22 14:52 ?2240次閱讀

    關(guān)于MySQL8.0版本選型的小技巧

    MySQL 8.0 第一個(gè)GA(General Availability)版本(正式、可用于生產(chǎn)的版本)于2018/4/19發(fā)布至今已有3年。8.0是一個(gè)全新的版本,增加了數(shù)百項(xiàng)功能新特性
    的頭像 發(fā)表于 03-29 13:45 ?1184次閱讀
    關(guān)于<b class='flag-5'>MySQL8.0</b>版本選型的小技巧

    請問mysql8.0不能在grant時(shí)創(chuàng)建用戶是什么原因?

    用習(xí)慣了MySQL5.7,當(dāng)在MySQL8.0里創(chuàng)建用戶時(shí),習(xí)慣性直接敲GRANT指令,結(jié)果報(bào)錯(cuò)了
    的頭像 發(fā)表于 08-11 10:16 ?2299次閱讀

    mysql8.0默認(rèn)字符集是什么

    MySQL 8.0 默認(rèn)字符集是 utf8mb4。 MySQL 8.0 是當(dāng)前最新的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由Oracle公司開發(fā)和維護(hù)。MySQ
    的頭像 發(fā)表于 11-16 14:48 ?1870次閱讀

    MySQL5.7數(shù)據(jù)導(dǎo)入8.0版本,這3款工具值得收藏!

    MySQL 5.7數(shù)據(jù)庫遷移到MySQL 8.0可以使用NineData、MySQL Shell、Percona XtraBackup和Liquibase等工具。每個(gè)工具都有自己的優(yōu)
    的頭像 發(fā)表于 11-29 16:47 ?2924次閱讀
    <b class='flag-5'>MySQL</b>5.7數(shù)據(jù)導(dǎo)入<b class='flag-5'>8.0</b>版本,這3款工具值得收藏!

    GitHub底層數(shù)據(jù)庫無縫升級到MySQL 8.0的經(jīng)驗(yàn)

    GitHub 團(tuán)隊(duì)近日分享了他們將 GitHub.com 的底層數(shù)據(jù)庫無縫升級到 MySQL 8.0 的經(jīng)驗(yàn)。 據(jù)介紹,GitHub 使用 MySQL 來存儲大量關(guān)系數(shù)據(jù),因此在不影響網(wǎng)站服務(wù)級別
    的頭像 發(fā)表于 12-13 10:21 ?552次閱讀
    GitHub底層數(shù)據(jù)庫無縫升級到<b class='flag-5'>MySQL</b> <b class='flag-5'>8.0</b>的經(jīng)驗(yàn)
    主站蜘蛛池模板: 精品含羞草免费视频观看| 中文在线观看永久免费| 国产三级多多影院| 99riav9 精品香蕉免费大视频| 色欲AV无码乱码精品国产| 久久精品国产亚洲AV未满十八| 成a人片亚洲日本久久| 与嫂子同居的日子在线观看| 同时和两老师双飞| 欧美大香线蕉线伊人久久| 很很射影院| 国产高清超清在线播放| 99视频福利| 伊人久久伊人| 亚洲a视频在线观看| 日日噜噜夜夜躁躁狠狠| 女子扒开腿让男生桶爽| 久久国产精品永久网站| 国产免国产免费| 国产成年人在线观看| qvod伦理片| 999在线观看精品免费| 月夜直播免费看| 亚洲欧美日韩在线码不卡 | 丝袜足控免费网站xx91| 女教师の诱惑| 老师的快感电影完整版| 久久高清内射无套| 国内精品久久久久影院老司 | YELLOW高清视频免费观看| 24小时日本在线观看片免费| 一个人免费播放高清在线观看| 亚州中文字幕| 午夜宅宅伦电影网中文字幕| 日韩亚洲国产中文字幕欧美| 人妻系列合集| 青青草国产偷拍在线av| 欧美成人亚洲高清在线观看| 男女床上黄色| 男生插女生下体| 欧美性猛交AAA片免费观看|