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

    • [mysql@localhost data]$ mkdir zhumh

clip_image021

clip_image022

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章