校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MySQL中的隱藏列的具體查看

MySQL中的隱藏列的具體查看

熱門標簽:電話機器人接口是什么樣的 怎么在高德地圖標注多個點 四川穩定外呼系統公司 百度地圖標注信息怎么修改 沈陽外呼系統有效果嗎 商家地圖標注圖片 溫州語音外呼系統排名 AI智能云呼電話機器人怎么注冊 福州外呼系統招商

在介紹mysql的多版本并發控制mvcc的過程中,我們提到過mysql中存在一些隱藏列,例如行標識、事務ID、回滾指針等,不知道大家是否和我一樣好奇過,要怎樣才能實際地看到這些隱藏列的值呢?

本文我們就來重點討論一下諸多隱藏列中的行標識DB_ROW_ID,實際上,將行標識稱為隱藏列并不準確,因為它并不是一個真實存在的列,DB_ROW_ID實際上是一個非空唯一列的別名。在撥開它的神秘面紗之前,我們看一下官方文檔的說明:

If a table has a PRIMARY KEY or UNIQUE NOT NULL index that consists of a single column that has an integer type, you can use _rowid to refer to the indexed column in SELECT statements

簡單翻譯一下,如果在表中存在主鍵或非空唯一索引,并且僅由一個整數類型的列構成,那么就可以使用SELECT語句直接查詢_rowid,并且這個_rowid的值會引用該索引列的值。

著重看一下文檔中提到的幾個關鍵字,主鍵、唯一索引、非空、單獨一列、數值類型,接下來我們就要從這些角度入手,探究一下神秘的隱藏字段_rowid

1、存在主鍵

先看設置了主鍵且是數值類型的情況,使用下面的語句建表:

CREATE TABLE `table1` (
  `id` bigint(20) NOT NULL PRIMARY KEY ,
  `name` varchar(32) DEFAULT NULL
) ENGINE=InnoDB;

插入三條測試數據后,執行下面的查詢語句,在select查詢語句中直接查詢_rowid

select *,_rowid from table1

查看執行結果,_rowid可以被正常查詢:

可以看到在設置了主鍵,并且主鍵字段是數值類型的情況下,_rowid直接引用了主鍵字段的值。對于這種可以被select語句查詢到的的情況,可以將其稱為顯式的rowid

回顧一下前面提到的文檔中的幾個關鍵字,分別對其進行分析。由于主鍵必定是非空字段,下面來看一下主鍵是非數值類型字段的情況,建表如下:

CREATE TABLE `table2` (
  `id` varchar(20) NOT NULL PRIMARY KEY ,
  `name` varchar(32) DEFAULT NULL
) ENGINE=InnoDB;

table2執行上面相同的查詢,結果報錯無法查詢_rowid,也就證明了如果主鍵字段是非數值類型,那么將無法直接查詢_rowid

2、無主鍵,存在唯一索引

上面對兩種類型的主鍵進行了測試后,接下來我們看一下當表中沒有主鍵、但存在唯一索引的情況。首先測試非空唯一索引加在數值類型字段的情況,建表如下:

CREATE TABLE `table3` (
  `id` bigint(20) NOT NULL UNIQUE KEY,
  `name` varchar(32)
) ENGINE=InnoDB;

查詢可以正常執行,并且_rowid引用了唯一索引所在列的值:

唯一索引與主鍵不同的是,唯一索引所在的字段可以為NULL。在上面的table3中,在唯一索引所在的列上添加了NOT NULL非空約束,如果我們把這個非空約束刪除掉,還能顯式地查詢到_rowid嗎?下面再創建一個表,不同是在唯一索引所在的列上,不添加非空約束:

CREATE TABLE `table4` (
  `id` bigint(20) UNIQUE KEY,
  `name` varchar(32)
) ENGINE=InnoDB;

執行查詢語句,在這種情況下,無法顯式地查詢到_rowid

和主鍵類似的,我們再對唯一索引被加在非數值類型的字段的情況進行測試。下面在建表時將唯一索引添加在字符類型的字段上,并添加非空約束:

CREATE TABLE `table5` (
  `id` bigint(20),
  `name` varchar(32) NOT NULL UNIQUE KEY
) ENGINE=InnoDB;

同樣無法顯示的查詢到_rowid

針對上面三種情況的測試結果,可以得出結論,當沒有主鍵、但存在唯一索引的情況下,只有該唯一索引被添加在數值類型的字段上,且該字段添加了非空約束時,才能夠顯式地查詢到_rowid,并且_rowid引用了這個唯一索引字段的值。

3、存在聯合主鍵或聯合唯一索引

在上面的測試中,我們都是將主鍵或唯一索引作用在單獨的一列上,那么如果使用了聯合主鍵或聯合唯一索引時,結果會如何呢?還是先看一下官方文檔中的說明:

_rowid refers to the PRIMARY KEY column if there is a PRIMARY KEY consisting of a single integer column. If there is a PRIMARY KEY but it does not consist of a single integer column, _rowid cannot be used.

簡單來說就是,如果主鍵存在、且僅由數值類型的一列構成,那么_rowid的值會引用主鍵。如果主鍵是由多列構成,那么_rowid將不可用。

根據這一描述,我們測試一下聯合主鍵的情況,下面將兩列數值類型字段作為聯合主鍵建表:

CREATE TABLE `table6` (
  `id` bigint(20) NOT NULL,
  `no` bigint(20) NOT NULL,
  `name` varchar(32),
  PRIMARY KEY(`id`,`no`)
) ENGINE=InnoDB;

執行結果無法顯示的查詢到_rowid

同樣,這一理論也可以作用于唯一索引,如果非空唯一索引不是由單獨一列構成,那么也無法直接查詢得到_rowid。這一測試過程省略,有興趣的小伙伴可以自己動手試試。

4、存在多個唯一索引

在mysql中,每張表只能存在一個主鍵,但是可以存在多個唯一索引。那么如果同時存在多個符合規則的唯一索引,會引用哪個作為_rowid的值呢?老規矩,還是看官方文檔的解答:

Otherwise, _rowid refers to the column in the first UNIQUE NOT NULL index if that index consists of a single integer column. If the first UNIQUE NOT NULL index does not consist of a single integer column, _rowid cannot be used.

簡單翻譯一下,如果表中的第一個非空唯一索引僅由一個整數類型字段構成,那么_rowid會引用這個字段的值。否則,如果第一個非空唯一索引不滿足這種情況,那么_rowid將不可用。

在下面的表中,創建兩個都符合規則的唯一索引:

CREATE TABLE `table8_2` (
  `id` bigint(20) NOT NULL,
  `no` bigint(20) NOT NULL,
  `name` varchar(32),
  UNIQUE KEY(no),
  UNIQUE KEY(id)
) ENGINE=InnoDB;

看一下執行查詢語句的結果:

可以看到_rowid的值與no這一列的值相同,證明了_rowid會嚴格地選取第一個創建的唯一索引作為它的引用。

那么,如果表中創建的第一個唯一索引不符合_rowid的引用規則,第二個唯一索引滿足規則,這種情況下,_rowid可以被顯示地查詢嗎?針對這種情況我們建表如下,表中的第一個索引是聯合唯一索引,第二個索引才是單列的唯一索引情況,再來進行一下測試:

CREATE TABLE `table9` (
  `id` bigint(20) NOT NULL,
  `no` bigint(20) NOT NULL,
  `name` varchar(32),
  UNIQUE KEY `index1`(`id`,`no`),
  UNIQUE KEY `index2`(`id`)
) ENGINE=InnoDB;

進行查詢,可以看到雖然存在一個單列的非空唯一索引,但是因為順序選取的第一個不滿足要求,因此仍然不能直接查詢_rowid

如果將上面創建唯一索引的語句順序調換,那么將可以正常顯式的查詢到_rowid

5、同時存在主鍵與唯一索引

從上面的例子中,可以看到唯一索引的定義順序會決定將哪一個索引應用_rowid,那么當同時存在主鍵和唯一索引時,定義順序會對其引用造成影響嗎?

按照下面的語句創建兩個表,只有創建主鍵和唯一索引的順序不同:

CREATE TABLE `table11` (
  `id` bigint(20) NOT NULL,
  `no` bigint(20) NOT NULL,
  PRIMARY KEY(id),
  UNIQUE KEY(no)
) ENGINE=InnoDB;

CREATE TABLE `table12` (
  `id` bigint(20) NOT NULL,
  `no` bigint(20) NOT NULL,
  UNIQUE KEY(id),
  PRIMARY KEY(no)
) ENGINE=InnoDB;

查看運行結果:

可以得出結論,當同時存在符合條件的主鍵和唯一索引時,無論創建順序如何,_rowid都會優先引用主鍵字段的值。

6、無符合條件的主鍵與唯一索引

上面,我們把能夠直接通過select語句查詢到的稱為顯式的_rowid,在其他情況下雖然_rowid不能被顯式查詢,但是它也是一直存在的,這種情況我們可以將其稱為隱式的_rowid

實際上,innoDB在沒有默認主鍵的情況下會生成一個6字節長度的無符號數作為自動增長的_rowid,因此最大為2^48-1,到達最大值后會從0開始計算。下面,我們創建一個沒有主鍵與唯一索引的表,在這張表的基礎上,探究一下隱式的_rowid

CREATE TABLE `table10` (
  `id` bigint(20),
  `name` varchar(32)
) ENGINE=InnoDB;

首先,我們需要先查找到mysql的進程pid

ps -ef | grep mysqld

可以看到,mysql的進程pid是2068:

在開始動手前,還需要做一點鋪墊, 在innoDB中其實維護了一個全局變量dictsys.row_id,沒有定義主鍵的表都會共享使用這個row_id,在插入數據時會把這個全局row_id當作自己的主鍵,然后再將這個全局變量加 1。

接下來我們需要用到gdb調試的相關技術,gdb是一個在Linux下的調試工具,可以用來調試可執行文件。在服務器上,先通過yum install gdb安裝,安裝完成后,通過下面的gdb命令 把 row_id 修改為 1:

gdb -p 2068 -ex 'p dict_sys->row_id=1' -batch

命令執行結果:

在空表中插入3行數據:

INSERT INTO table10 VALUES (100000001, 'Hydra');
INSERT INTO table10 VALUES (100000002, 'Trunks');
INSERT INTO table10 VALUES (100000003, 'Susan');

查看表中的數據,此時對應的_rowid理論上是1~3:

然后通過gdb命令把row_id改為最大值2^48,此時已超過dictsys.row_id最大值:

gdb -p 2068 -ex 'p dict_sys->row_id=281474976710656' -batch

命令執行結果:

再向表中插入三條數據:

INSERT INTO table10 VALUES (100000004, 'King');
INSERT INTO table10 VALUES (100000005, 'Queen');
INSERT INTO table10 VALUES (100000006, 'Jack');

查看表中的全部數據,可以看到第一次插入的三條數據中,有兩條數據被覆蓋了:

為什么會出現數據覆蓋的情況呢,我們對這一結果進行分析。首先,在第一次插入數據前_rowid為1,插入的三條數據對應的_rowid為1、2、3。如下圖所示:

當手動設置_rowid為最大值后,下一次插入數據時,插入的_rowid重新從0開始,因此第二次插入的三條數據的_rowid應該為0、1、2。這時準備被插入的數據如下所示:

當出現相同_rowid的情況下,新插入的數據會根據_rowid覆蓋掉原有的數據,過程如圖所示:

所以當表中的主鍵或唯一索引不滿足我們前面提到的要求時,innoDB使用的隱式的_rowid是存在一定風險的,雖然說2^48這個值很大,但還是有可能被用盡的,當_rowid用盡后,之前的記錄就會被覆蓋。從這一角度也可以提醒大家,在建表時一定要創建主鍵,否則就有可能發生數據的覆蓋。

本文基于mysql 5.7.31 進行測試

官方文檔:https://dev.mysql.com/doc/refman/5.7/en/create-index.html

到此這篇關于MySQL中的隱藏列的具體使用的文章就介紹到這了,更多相關MySQL 隱藏列內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL 8.0新特性之隱藏字段的深入講解
  • mysql sql語句隱藏手機號碼中間四位的方法
  • MySQL在Linux系統中隱藏命令行中的密碼的方法

標簽:營口 汕尾 寶雞 西寧 邯鄲 來賓 無錫 七臺河

巨人網絡通訊聲明:本文標題《MySQL中的隱藏列的具體查看》,本文關鍵詞  MySQL,中的,隱藏,列,的,具體,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL中的隱藏列的具體查看》相關的同類信息!
  • 本頁收集關于MySQL中的隱藏列的具體查看的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日本色综合中文字幕| 国产美女视频一区| 风间由美一区二区三区在线观看| 成人h版在线观看| 日韩中文字幕一区二区三区| 2022国产精品视频| 欧美日韩免费一区二区三区| 粉嫩一区二区三区在线看| 亚洲一区二区高清| 亚洲男女毛片无遮挡| 欧美国产丝袜视频| 777午夜精品免费视频| 93久久精品日日躁夜夜躁欧美| 成人中文字幕电影| 成人做爰69片免费看网站| 经典三级一区二区| 国产成人在线看| www.亚洲激情.com| 一本久久精品一区二区| 9i在线看片成人免费| 波多野结衣亚洲| 欧美xxxxxxxxx| 日韩限制级电影在线观看| 国产一区视频在线看| 日韩激情一二三区| 美女一区二区三区在线观看| 不卡一二三区首页| 美女性感视频久久| 国产日韩欧美综合在线| 99精品桃花视频在线观看| 91福利精品视频| 欧美肥大bbwbbw高潮| 91福利国产成人精品照片| 日韩欧美国产系列| 久久久久国产一区二区三区四区| 国产精品污网站| 亚洲免费色视频| 精品久久人人做人人爰| 日本一区二区在线不卡| 亚洲国产精品一区二区久久| 91网站视频在线观看| 欧美大尺度电影在线| 夜夜亚洲天天久久| 欧美日韩国产a| 亚洲欧美一区二区三区国产精品| 欧美日韩国产乱码电影| 国产美女av一区二区三区| 亚洲国产精品精华液ab| 久久蜜臀精品av| 91麻豆产精品久久久久久| 国产九色sp调教91| 日本最新不卡在线| 亚洲国产aⅴ天堂久久| 欧美精品xxxxbbbb| 欧美日本在线看| 另类综合日韩欧美亚洲| 99视频精品免费视频| 免费视频最近日韩| 视频一区二区不卡| 亚洲大型综合色站| 午夜精品福利一区二区三区av| 国产午夜精品福利| 国产日韩欧美高清在线| 精品国产1区2区3区| 精品剧情在线观看| 中文字幕乱码一区二区免费| 欧美激情一区在线| 亚洲人精品一区| 亚洲国产精品一区二区www在线| 丝袜美腿高跟呻吟高潮一区| 午夜欧美大尺度福利影院在线看| 午夜不卡av免费| 美女网站视频久久| av亚洲产国偷v产偷v自拍| 色视频欧美一区二区三区| 91精品国产品国语在线不卡| 久久久久国产一区二区三区四区| 国产精品色噜噜| 久久99精品国产麻豆不卡| 国产成人精品一区二区三区网站观看| 播五月开心婷婷综合| 欧美一区2区视频在线观看| 中文字幕在线不卡一区| 久久99精品视频| 欧美日本一道本| 夜夜嗨av一区二区三区四季av| 日韩黄色小视频| 欧美日韩精品一区二区三区四区| 欧美午夜电影一区| 日韩三级视频在线观看| 国产精品久久久久久久久免费樱桃 | 一区二区三区日本| 亚洲视频在线一区| 亚洲成人手机在线| 国产精品羞羞答答xxdd| 在线一区二区视频| 五月婷婷色综合| 欧美性淫爽ww久久久久无| 亚洲一区二区欧美| 欧美日韩成人综合天天影院| 一区二区三区欧美亚洲| 欧美一区二区网站| 捆绑调教美女网站视频一区| 欧美电影免费观看高清完整版在线| 久久国内精品视频| 久久免费看少妇高潮| 粉嫩av一区二区三区在线播放 | 综合自拍亚洲综合图不卡区| 播五月开心婷婷综合| 亚洲免费高清视频在线| 色天使久久综合网天天| 天堂va蜜桃一区二区三区漫画版| 欧美日韩五月天| 日本vs亚洲vs韩国一区三区二区| 91精品久久久久久蜜臀| 久久国产精品免费| 中文av一区二区| 欧美丝袜第三区| 免费成人结看片| 久久精品一区二区| 国产精品一品二品| 亚洲欧美国产77777| 欧美日韩性生活| 国产乱人伦偷精品视频免下载| 亚洲人成精品久久久久久| 911国产精品| 国产91精品入口| 亚洲第一综合色| www激情久久| 欧美日韩日日夜夜| 国产乱码字幕精品高清av| 专区另类欧美日韩| 欧美大度的电影原声| 91片在线免费观看| 蜜臀久久99精品久久久久久9| 欧美激情一区二区三区蜜桃视频| 欧美伊人久久久久久久久影院| 老鸭窝一区二区久久精品| 日韩一区有码在线| 久久综合久久综合久久综合| 色呦呦日韩精品| 国产精品1区2区3区在线观看| 亚洲高清视频的网址| 国产精品三级av| 精品国内片67194| 欧美在线播放高清精品| 国产高清精品久久久久| 日本在线观看不卡视频| 日韩激情av在线| 亚洲免费观看高清完整版在线| 国产精品天美传媒| 2023国产一二三区日本精品2022| 在线观看精品一区| 99久久精品99国产精品| 国产毛片精品国产一区二区三区| 亚洲成国产人片在线观看| 国产精品国产三级国产普通话99| 欧美mv日韩mv国产| 欧美一区二区三区视频免费| 在线免费一区三区| 一本一道久久a久久精品 | 欧美岛国在线观看| 欧美日韩免费电影| 丁香六月久久综合狠狠色| 石原莉奈在线亚洲二区| 亚洲成a人v欧美综合天堂| 18欧美乱大交hd1984| 国产欧美精品一区二区色综合朱莉| 日韩三级视频中文字幕| 欧美色偷偷大香| 日韩精品最新网址| 日韩欧美国产一区二区三区 | 日本成人在线视频网站| 婷婷丁香久久五月婷婷| 美女脱光内衣内裤视频久久网站| 午夜电影一区二区| 日精品一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 五月天激情综合网| 午夜成人在线视频| 国内国产精品久久| www.欧美色图| 欧美一级欧美三级在线观看| 国产亚洲一二三区| 亚洲va国产天堂va久久en| 狠狠色狠狠色综合| 一本久久a久久精品亚洲| 欧美一级在线视频| 中文字幕欧美一区| 久久er精品视频| 色综合咪咪久久| 久久亚洲综合色| 午夜欧美大尺度福利影院在线看| 国产一区二三区| 欧美日韩久久一区| 国产精品久久久一本精品| 欧美96一区二区免费视频| av中文字幕亚洲| 国产亚洲一区二区在线观看| 午夜精品成人在线视频|