1. 程式人生 > >MySQL 8.0新特性-資料字典

MySQL 8.0新特性-資料字典

歡迎關注MySQL 8.0必知必會系列課程。

    MySQL8.0必知必會-自動化部署                 https://edu.51cto.com/course/16368.html

    MySQL8.0必知必會之引數標準化配置       https://edu.51cto.com/course/16358.html



1 主要內容

    • 資料字典表

    • 元資料檔案

    • INFORMATION_SCHEMA的變化

    • Innodb的變化-SDI

    • 使用資料字典後的變化

    • 資料字典的侷限性

2 資料字典表

2.1 在MySQL 8.0 以前的版本中

    • 字典資料儲存在元資料檔案非事務系統表

    • 儲存引擎 MyISAM innodb csv

    • SELECT TABLE_SCHEMA,TABLE_NAME,ENGINE FROM information_schema.TABLES a WHERE a.TABLE_SCHEMA in ('mysql') order by 1,3;

clip_image002

2.2 MySQL 8.0

    • 事務資料字典,資料庫物件的資訊儲存在事務表中。

    • 儲存引擎 innodb

    • 資料字典表是不可見的

    • 無法讀取

SELECT

    • 不會出現在輸出中SHOW TABLES

    • 未列在INFORMATION_SCHEMA.TABLES 表中

    • 在大多數情況下INFORMATION_SCHEMA,可以查詢相應的表(名稱相同)。

    • 從概念上講,INFORMATION_SCHEMA提供了一個MySQL公開資料字典元資料的檢視

2.3 檢視隱藏的Data Dictionary表

    1) cmake編譯時,必須使用-DWITH_DEBUG=1

    2) 設定debug引數

    SET SESSION debug='+d,skip_dd_table_access_check’;

    3) 查詢mysql.tables字典表

    SELECT name, schema_id, hidden, type FROM mysql.tables where schema_id=1 AND hidden='System’;

    4) 訪問字典表

    SHOW CREATE TABLE mysql.catalogs\G

l 隱藏的資料字典表

clip_image004

l 開啟debug

clip_image006

l 未開啟debug

clip_image008

l 資料字典表

catalogs

目錄資訊。

character_sets

有關可用字符集的資訊。

collations

有關每個字符集的排序規則的資訊。

column_statistics

列值的直方圖統計資訊。

column_type_elements

有關列使用的型別的資訊。

columns

有關表中列的資訊。

dd_properties

標識資料字典屬性(例如其版本)的表。伺服器使用它來確定是否必須將資料字典升級到較新的版本。

events

有關事件計劃程式事件的資訊。

foreign_keys, foreign_key_column_usage

有關外來鍵的資訊。

index_column_usage

有關索引使用的列的資訊。

index_partitions

有關索引使用的分割槽的資訊。

index_stats

用於儲存ANALYZE TABLE執行時生成的動態索引統計資訊。

indexes

有關表索引的資訊。

innodb_ddl_log

儲存DDL日誌以進行崩潰安全的DDL操作。

parameter_type_elements

有關儲存過程和函式引數的資訊,以及有關儲存函式的返回值的資訊。

parameters

有關儲存過程和函式的資訊。

resource_groups

有關資源組的資訊。

routines

有關儲存過程和函式的資訊。

schemata

有關schemata的資訊。該表提供了有關資料庫的資訊。

st_spatial_reference_systems

有關空間資料的可用空間參考系統的資訊。

table_partition_values

有關表分割槽使用的值的資訊。

table_partitions

有關表使用的分割槽的資訊。

table_stats

有關ANALYZE TABLE執行時生成的動態表統計資訊的資訊。

tables

有關資料庫中表的資訊。

tablespace_files

有關表空間使用的檔案的資訊。

tablespaces

有關活動表空間的資訊。

triggers

有關觸發器的資訊。

view_routine_usage

有關檢視與它們使用的儲存函式之間的依賴關係的資訊。

view_table_usage

用於跟蹤檢視及其基礎表之間的依賴關係。

3 元資料儲存

    • 先前儲存在元資料檔案中的資料現在儲存在資料字典表

    • 被刪除的元資料檔案

    • .frm:表元資料檔案。

    • .par:分割槽定義檔案。

    • .TRN :觸發名稱空間檔案。

    • .TRG :觸發器引數檔案。

    • .isl:InnoDB符號連結檔案,包含在資料目錄外部建立的每表文件表空間檔案的位置。

    • db.opt:資料庫配置檔案。

clip_image010

clip_image012

l isl 檔案

    • Mysql 5.7.22

    • create table test(a int) DIRECTORY=‘/home/mysql/’ ENGINE= innodb;

    • Mysql 8.0.11

    • create table test1(a int) DIRECTORY=‘/home/mysql/’ ENGINE= innodb;

clip_image014

4 資料儲存

    • 字典資料儲存在innodb表

    • 資料字典表和非資料字典系統表都儲存在mysql資料庫

    • mysql.ibd

    • 位於datadir目錄中

    • 儲存資料庫字典表

    • 只用於MySQL 資料字典資料

    • 檔名字禁止修改,不能被其他表空使用

    • 具備事務的特性

    • commit

    • rollback

    • crash-recovery

5 字典物件快取

    • 共享的全域性快取

    • 將先前訪問的資料字典物件儲存在記憶體中,便於重用物件,減少磁碟I / O

    • 使用 LRU的策略刪除最近最少使用的物件

    • tablespace定義快取分割槽

    • 儲存資料字典表空間定義物件

    • tablespace_definition_cache

    • 可以儲存在字典物件快取記憶體中的表空間定義物件數(已使用和未使用)的數量。

    • 預設值為256。

    • 0,表示僅儲存使用的表空間定義物件

    • 當在用的表空間定義物件數量小於tablespace_definition_cache的值時,可以儲存未使用的表空間定義物件

6 INFORMATION_SCHEMA

6.1 資料字典表的檢視

    • datadir下沒有information_schema目錄

    • 直接從資料字典表獲取資訊,查詢效率更高

    • 改進點:

    • 查詢INFORMATION_SCHEMA表時,不建立臨時表

    • 直接通過資料字典表獲取資料,不在通過目錄掃描(show databases,show tables)或檔案開啟(從frm讀取資訊)獲取資料。

    • 允許使用索引構建有效的執行計劃

    • 快取STATISTICS和 TABLES中的表統計資訊

6.2 執行計劃

    EXPLAIN SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME = 'utf8mb4';

clip_image016

clip_image018

7 統計資訊

7.1 INFORMATION_SCHEMA表包含提供表統計資訊的列:

    • STATISTICS.CARDINALITY

    • TABLES.AUTO_INCREMENT

    • TABLES.AVG_ROW_LENGTH

    • TABLES.CHECKSUM

    • TABLES.CHECK_TIME

    • TABLES.CREATE_TIME

    • TABLES.DATA_FREE

    • TABLES.DATA_LENGTH

    • TABLES.INDEX_LENGTH

    • TABLES.MAX_DATA_LENGTH

    • TABLES.TABLE_ROWS

    • TABLES.UPDATE_TIME

    • 統計資訊來源於mysql.index_stats、mysql.table_stats

    • 快取的統計資訊有過期時間

    • 快取的統計資訊不可用或已過期時,MySQL將從儲存引擎中檢索最新的統計資訊,並更新mysql.index_stats和 mysql.table_stats字典表。

    • 查詢優先檢索快取的統計資訊,直到快取的統計資訊過期

7.2 以下情況不更新統計資訊:

    • 快取統計資訊尚未過期時。

    • information_schema_stats_expiry 設定為0。

    • 當伺服器開啟read_only, super_read_only, transaction_read_only,或 innodb_read_only模式。

    • 當查詢還需要獲取Performance Schema資料時。

    • 手工更新給定表的快取值,請使用 ANALYZE TABLE

    7.3 information_schema_stats_expiry

    • 定義快取統計資訊到期時間段

    • 單位:秒

    • 預設值為86400秒(24小時) ,但時間段可以延長至一年。

    • 0:要始終直接從儲存引擎檢索最新統計資訊並繞過快取值

    • 會話變數

    • 每個客戶端會話都可以定義自己的到期值。

    • 從儲存引擎檢索並由一個會話快取的統計資訊可供其他會話使用。

8 序列化字典資訊(SDI)

8.1 元資料儲存的兩種方式:

    • 資料字典表

    • 序列化字典資訊(SDI)

    • 不同儲存引擎SDI的儲存方式:

    • Innodb儲存引擎:儲存在其表空間檔案中

    • 其他儲存引擎: 將SDI資料儲存在對應schema目錄下.sdi檔案中

    • SDI資料以緊湊JSON格式儲存

8.2 innodb

    •  儲存在除臨時表空間和撤消表空間檔案之外的所有表空間檔案

    • 僅記錄了表空間中包含的表和表空間物件的描述。

    • 僅通過表空間中的表上的DDL操作進行更新

    • 單獨使用一個16K的索引頁,以壓縮的方式儲存SDI 資訊

    • 提供了元資料冗餘。例如,如果資料字典變得不可用,則可以InnoDB 使用ibd2sdi工具直接從表空間檔案中提取物件元資料

    • /usr/local/mysql8/bin/ibd2sdi --dump-file=test.sdi /mysqldb/db_vastdata8/data/sakila/city.ibd

clip_image020

9 使用資料字典後的變化

9.1 innodb_read_only

    • 阻止所有儲存引擎的建立和刪除表操作

    • 任何儲存引擎的表建立和刪除操作都會修改mysql系統資料庫中的資料字典表

    • ANALYZE TABLE 失敗,因為它更新了表統計資訊,這些統計資訊儲存在資料字典中。

    • ALTER TABLE tbl_name ENGINE=engine_name 失敗,因為它更新了儲存在資料字典中的儲存引擎名稱。

9.2 CREATE TABLE dst_tbl LIKE src_tbl

    • 要求它 src_tbl是一個基表,如果它是一個INFORMATION_SCHEMA 資料字典表檢視的表,則會失敗。

    • create table t like information_schema.tables;

9.3 mysqldumpmysqlpump

    • 只匯出該資料庫中的非資料字典表

    • proc and event表不在使用

    • 匯出routines and events時,必須使用--all-databases --routines --events

    • --routines 需要select on *.*許可權

    • 匯出routine and event 時,無法匯出creation and modification timestamps

    •  stored routine 建立時,如果包括非法字元,會直接報錯。以前的版本只是丟擲warning

10 資料字典的侷限性

    • MySQL伺服器無法識別手動建立的資料庫目錄。

    • 不支援在資料目錄下手動建立資料庫目錄(例如,使用mkdir)

    • DDL操作耗時變長

    • 不是單純的修改.frm檔案

    • 需要寫入redo log和undo log

    • [[email protected] data]$ mkdir zhumh

clip_image021

clip_image022