我們來體驗一下MySQL 8.0.23新特性:不可見列(invisible 關鍵字)。傳統版本資料庫中所有列都是可以查詢的,現在可以指定一個不可見的列,它將對查詢隱藏。如果顯式引用,它可以被查到。1、首先建表
create table test_invisible( id int, name varchar(20), money float invisible)
我們假設錢這個欄位涉及隱私,那麼我們設定為不可見,用關鍵字 invisible,在表結構中我們在Extra列可以看到INVISIBLE 關鍵字:
2、查詢一下該表select * from test_invisible
可以看到我們只能看到2個列,不可見列是目前是不顯示的。
3、假設我們插入一些記錄來看看效果insert into test_invisible values (1,'zhangsan',123)
報錯資訊:[21S01][1136] Column count doesn't match value count at row 1
如預期,插入語句中如果我們不引用它,會報錯。
如果想插入必須顯示的指定列名,這麼插入:
insert into test_invisible(id,name,money) values (1,'zhangsan',123)
查詢的時候,要注意,如果用
select * from test_invisible
是無法查詢money列的,如下圖
必須指定列
select money from test_invisible
4、不可見列在什麼場景上使用呢?
首先我們要知道InnoDB如何儲存資料?innoDB在表空間儲存資料。這些記錄儲存並用聚簇索引排序(主鍵):它們被稱為索引組織表。所有的二級索引也將主鍵作為索引中的最右邊的列(即使沒有公開)。這意味著當使用二級索引檢索一條記錄時,將使用兩個索引:二級索引指向用於最終檢索該記錄的主鍵。主鍵會影響隨機I/O和順序I/O之間的比率以及二級索引的大小。
簡單來講對InnoDB表來說,當沒有定義主鍵,會使用第一個唯一非空列。如果沒有可用的列,InnoDB會建立一個隱藏主鍵(6位)。
這類主鍵的問題在於您無法控制它,更糟糕的是,這個值對所有沒有主鍵的表是全域性的,如果您同時對這些表執行多次寫操作,可能會產生爭用問題(dict_sys->mutex)。
不可見列的用處:有了新的不可見列,如果業務上不允許新增新列,我們現在就可以向沒有主鍵的表新增合適的主鍵。例如老系統的表不適合新增列,而且可能沒有索引的表,create table test( name varchar(20), money float)
現在新增指定不可見主鍵:
alter table test add column id int unsigned auto_increment primary key invisible first;
總結
在InnoDB中主鍵很重要,如果存量表沒有主鍵,又不能顯性新增列的話
從MySQL8.0.23開始,您可以用不可見列解決沒有主鍵的表。
最新評論